【问题标题】:I have an IndexOutOfBoundsException and can't figure out why我有一个 IndexOutOfBoundsException 并且不知道为什么
【发布时间】:2013-06-18 19:54:21
【问题描述】:

我有一个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));
}

似乎是什么问题?

【问题讨论】:

  • size 定义在哪里?
  • tagNamesAL.size() = size ?
  • 您确定案例块已完成吗?如果没有覆盖 on 选项,则不会添加 JTextField .. 尝试插入默认大小写进行检查。
  • 大小在int size = tagNamesAL.size() 上面定义(类似这样)
  • @EduardoRocha (something like this) 是什么意思?您对此不确定吗?

标签: java swing exception indexoutofboundsexception


【解决方案1】:

问题是 jTextFieldAL.get(i) 可能不存在导致 i &gt;= jTextFieldAl.size() 。因为你的 switch 语句中的原因可能无论如何都不会输入。

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

正如@camickr 所说,您不应该使用KeyListener(您需要集中注意力并且可能并不总是有效),您可以使用DocumentListenerKeyBindings 来满足您的目的。

【讨论】:

  • +1,另外,不要在文本字段上使用 KeyListener。相反,您可能应该使用DocumentListener
  • 是的,除了 KeyListener 之外的任何东西都应该使用。
【解决方案2】:

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

【讨论】:

  • @nachokk:他没有将size 传递给它——他创建了一个空列表。我错过了什么吗?
  • @nachokk:大小和容量之间存在差异 - 它可能会使用默认的 容量 10 创建它,但我怀疑它是否使用默认的 创建它size 为 10。索引检查是针对大小而不是容量进行的。
【解决方案3】:

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

【讨论】:

  • -1,已经提到过两次。无需用重复的答案将论坛弄得一团糟。
【解决方案4】:

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

【讨论】:

  • 代码在for循环结束时结束。在将 i 加到 size 的值之后,你看不到会发生什么。
猜你喜欢
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多