我有一个IndexOutOfBoundsException,无法弄清楚原因

时间:2013-06-21 15:49:33

标签: java swing exception indexoutofboundsexception

我有一个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 个答案:

答案 0 :(得分:4)

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

  

抛出:IndexOutOfBoundsException - 如果索引超出范围   (index&lt; 0 || index&gt; = size())

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

答案 1 :(得分:3)

在for循环之后,i大于size,并且您尝试从jLabelAL.get(i)读取某些内容,即超出边界 - &gt;导致你的异常

答案 2 :(得分:2)

由于交换机没有默认情况,因此不一定要在每次迭代时向jTextFieldAL添加元素。如果您在每次迭代时都没有向jTextFieldAL添加元素,直到并包括当前的迭代,那么当您执行jTextFieldAL.get(i)时,您将读取越界,因为您添加的最后一个元素(如果任何)的索引严格小于i。实际上,这意味着您将在第一次迭代中获得IndexOutOfBoundsException,而您无法将元素添加到jTextFieldAL

答案 3 :(得分:0)

我认为您的交换机块中没有'default'。 循环迭代中jTextFieldAL长度可能不会增加。 所以你会遇到IndexOutOfBoundException