0

我有一个IndexOutOfBoundsException,我不知道为什么。

我有几个文本字段(Integer、Double 和其他),我需要根据上面的信息使用它们ArrayList<String> tagContentAL

这是我的代码:

jLabelAL = new ArrayList<>();
jTextFieldAL = new ArrayList<>();

for (int i = 0; i < size; i++) {
    jLabelAL.add(new JLabel("" + tagNamesAL.get(i)));
    switch (tagContentAL.get(i).toString()) {
        case "int":
                jTextFieldAL.add((JTextField) new tools.IntegerTextField(simulation));
                break;
        case "double":
        case "float":
                jTextFieldAL.add((JTextField) new tools.DoubleTextField(simulation));
                break;
        case "*":
                jTextFieldAL.add((JTextField) new JTextField());
                break;
    }

    jTextFieldAL.get(i).addKeyListener(keyEvent); //IndexOutOfBoundsException in this line
    p1.add(jLabelAL.get(i));
    p1.add(jTextFieldAL.get(i));
}

似乎是什么问题?

4

4 回答 4

4

问题是jTextFieldAL.get(i)可能不存在原因i >= jTextFieldAl.size()。因为您的 switch 语句中的原因可能在任何情况下都不会输入。

抛出:IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())

正如@camickr 所说,您不应该使用KeyListener(您需要专注并且可能并不总是有效)您可以使用DocumentListenerKeyBindings用于您的目的。

于 2013-06-21T15:54:21.723 回答
3

在 for 循环 i 大于大小之后,您尝试从 jLabelAL.get(i) 中读取一些内容,这超出了边界 -> 导致您的异常

于 2013-06-21T15:52:04.233 回答
2

不一定要jTextFieldAL在每次迭代中添加一个元素,因为 switch 没有默认情况。如果您没有jTextFieldAL在每次迭代(包括当前迭代)上添加一个元素,那么当您这样做时,您将读取越界jTextFieldAL.get(i),因为您添加的最后一个元素(如果有)的索引将严格小于i. 实际上,这意味着您将IndexOutOfBoundsException在第一次迭代中无法将元素添加到jTextFieldAL.

于 2013-06-21T15:53:50.903 回答
0

我认为您的开关块中没有“默认”。jTextFieldAL 长度可能不会在循环迭代中增加。所以你会遇到 IndexOutOfBoundException

于 2013-06-21T15:58:58.183 回答