我有一个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));
}
什么似乎是问题?
答案 0 :(得分:4)
问题是jTextFieldAL.get(i)
可能不存在导致i >= jTextFieldAl.size()
。在任何情况下,switch语句中的原因都可能无法输入。
抛出:IndexOutOfBoundsException - 如果索引超出范围 (index&lt; 0 || index&gt; = size())
正如@camickr所说,你不应该使用KeyListener
(你需要专注而且可能并不总是有效),你可以使用DocumentListener
或KeyBindings
来达到目的。
答案 1 :(得分:3)
在for循环之后,i大于size,并且您尝试从jLabelAL.get(i)读取某些内容,即超出边界 - &gt;导致你的异常
答案 2 :(得分:2)
由于交换机没有默认情况,因此不一定要在每次迭代时向jTextFieldAL
添加元素。如果您在每次迭代时都没有向jTextFieldAL
添加元素,直到并包括当前的迭代,那么当您执行jTextFieldAL.get(i)
时,您将读取越界,因为您添加的最后一个元素(如果任何)的索引严格小于i
。实际上,这意味着您将在第一次迭代中获得IndexOutOfBoundsException
,而您无法将元素添加到jTextFieldAL
。
答案 3 :(得分:0)
我认为您的交换机块中没有'default'。 循环迭代中jTextFieldAL长度可能不会增加。 所以你会遇到IndexOutOfBoundException