Java 我有一个IndexOutOfBoundsException,可以';我不明白为什么

Java 我有一个IndexOutOfBoundsException,可以';我不明白为什么,java,swing,exception,indexoutofboundsexception,Java,Swing,Exception,Indexoutofboundsexception,我有一个IndexOutOfBoundsException,我不知道为什么 我有几个文本字段(整数、双精度和其他),需要根据ArrayList标记contental 这是我的密码: jLabelAL = new ArrayList<>(); jTextFieldAL = new ArrayList<>(); for (int i = 0; i < size; i++) { jLabelAL.add(new JLabel("" + tagNamesAL.ge

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

我有几个文本字段(整数、双精度和其他),需要根据
ArrayList标记contental

这是我的密码:

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));
}
jLabelAL=newarraylist();
jTextFieldAL=newarraylist();
对于(int i=0;i

问题似乎出在哪里?

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

不一定是在每次迭代时向
jTextFieldAL
添加元素,因为开关没有默认情况。如果您在当前迭代之前(包括当前迭代)的每次迭代中都没有向
jTextFieldAL
添加元素,那么在执行
jTextFieldAL.get(i)
时,您将读取超出范围的内容,因为您添加的最后一个元素(如果有)的索引将严格小于
i
。实际上,这意味着您将在第一次迭代中获得一个
IndexOutOfBoundsException
,在该迭代中,您未能向
jTextFieldAL

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

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


正如@camickr所说的,你不应该使用
keylister
(你需要有焦点,而且可能不会一直工作),你可以使用
DocumentListener
KeyBindings

我认为你的开关块中没有“default”。 JTextField长度在循环迭代中可能不会增加。
因此,您将点击IndexOutOfBoundException

其中定义了
size
标记名称。size()=size?您确定案例块已完成吗?如果没有覆盖on选项,则不会添加JTextField。。请尝试插入一个默认的大小写进行检查。size是在上面定义的
int size=tagNamesAL.size()
(类似于此)@EduardoRocha您所说的
(类似于此)
?。您对此不确定?+1,另外,不要在文本字段上使用KeyListener。相反,您可能应该使用
DocumentListener
。是的,通常应该使用除KeyListener之外的任何东西。代码在for循环的末尾结束。你看不到我加上大小值后会发生什么。-1,已经提到过两次。没有必要在论坛上重复回答。@nachokk:他没有把
size
传递给它,而是创建了一个空列表。我遗漏了什么吗?@nachokk:大小和容量是有区别的——它可能会创建默认容量10,但我怀疑它创建默认容量10。索引检查是根据大小而不是容量进行的。