我有一个文本字段,其输入数据应为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

07-26 04:08