gpt4 book ai didi

java - 使用循环创建 JFormattedTextField 时出现 ArrayIndexOutOfBoundsException

转载 作者:行者123 更新时间:2023-12-01 22:00:39 25 4
gpt4 key购买 nike

我想创建一些JFormattedTextFields,但总是得到ArrayIndexOutOfBoundsException,我不明白为什么。变量 globalZaehler2 是 51,然后我会得到异常。但我的循环说它必须是<field.length(即51)。那么 globalZaehler2 不能是 51 吗?当我使用 ((JFormattedTextField)field[globalZaehler2]).selectAll();

时,Eclipse 向我显示异常
for (globalZaehler2 = 0; globalZaehler2 < field.length; globalZaehler2++) {
if (field[globalZaehler2] instanceof JFormattedTextField) {
((JFormattedTextField)field[globalZaehler2]).addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
((JFormattedTextField)field[globalZaehler2]).selectAll();
// do something with the text in the field
}
});
}
}

最佳答案

我们无法轻易辨别,但是 globalZaehler2 这个名称听起来像是一个字段,而不是局部变量。在 for 循环中使用字段作为“索引”变量几乎总是是一个坏主意......我不记得上次想要一个状态的时间了对象在循环内像这样改变。

这意味着在 actionPerformed 执行时,您可以使用不同长度的字段执行循环多次。但是,如果您尝试将其设为局部变量,则会遇到不同的问题,因为您在匿名内部类中引用它 - 这意味着它需要是一个final 局部变量...这就是真正的问题所在。

基本上,您希望 actionPerformed 中的代码使用 globalZaehler2 的值来进行循环迭代...但事实并非如此在循环迭代期间执行...它在 Action 监听器触发时执行。

可以通过在循环中声明局部变量来解决这个问题:

for (globalZaehler2 = 0; globalZaehler2 < field.length; globalZaehler2++) {
// In Java 8 you wouldn't need the final part
final int copy = globalZaehler2;
// Use copy instead of globalZaehler2 within actionPerformed
}

但是,更好的解决方案有两个方面:

  • 当您使用 for 循环中的变量作为数组的索引,并且要遍历整个数组时,请使用增强的 for 循环
  • 如果您发现自己在代码中多次使用公共(public)子表达式,请将其提取到单个表达式

就您而言,这将是:

// We don't know the type of field, so it's hard to guess the
// type here. Likewise I *would* use the name field, but that's the
// name of the array... it should probably be called fields, as it's
// naturally plural...
for (Object fooField : field) {
if (fooField instanceof JFormattedTextField) {
// Again, don't bother with final in Java 8
final JFormattedTextField textField = (JFormattedTextField) fooField;
textField.addActionListener(new ActionListener()) {
@Override public void actionPerformed(ActionEvent e) {
textField.selectAll();
// etc
}
});
}
}

现在,您自然地在循环中获得了一个新的局部变量 (textField),因此它实际上可以是final,并在 actionPerformed 方法内部使用。

关于java - 使用循环创建 JFormattedTextField 时出现 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33544167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com