我有一个文本字段,其输入数据应为16位,并在第4、8、12位后键入空格,我编写了这段代码,当添加第二个内部条件if时,程序出现堆栈溢出错误,我该怎么办什么问题?请帮助。
这是我的代码,我使用更改侦听器:
cardNumberField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> ov, String t, String t1){
if (t1.length() > 0) {
String s = null;
s = t1.substring(t1.length() - 1,t1.length());
if (!s.matches("\\d") || t1.length() > 19) {
cardNumberField.setText(t);
}
if(t1.length() == 4 || t1.length() == 9 || t1.length() == 14){
cardNumberField.setText(t1 + " ");
}
}
}
});
最佳答案
假设您在文本字段中输入了三个字符(“ 123”),然后输入第四个字符(例如数字)。 “ 4”。当然,这会调用您的侦听器。
第一个条件为假(因为最后一个字符是数字,并且长度小于16)。
第二个条件为true,因为t1.length()==4
。因此,您现在调用setText("1234 ")
。
这将更改文本,因此它将再次调用您的侦听器。这次第一个条件匹配(因为最后一个字符不是数字)。因此,现在您调用setText("1234")
。
这将更改文本,因此将调用您的侦听器。
第一个条件为假(因为最后一个字符是数字,并且长度小于16)。
第二个条件为true,因为t1.length()==4
。因此,您现在调用setText("1234 ")
。
这将更改文本,因此它将再次调用您的侦听器。这次第一个条件匹配(因为最后一个字符不是数字)。因此,现在您调用setText("1234")
。
等等。因此,您基本上具有无限递归,并且在某个时间点(非常快),堆栈无法容纳所有方法调用。
要修复它,请修复您的逻辑。最好是防止用户输入无效的文本,而不是侦听并尝试在事后进行补救。您可能需要查看this。