检查null时,ArrayList中的IndexOutOfBoundsException,java

检查null时,ArrayList中的IndexOutOfBoundsException,java,java,arraylist,null,indexoutofboundsexception,Java,Arraylist,Null,Indexoutofboundsexception,我在使用ArrayList时遇到了问题,它会填充一个表格模型。 在第二个for循环中,应用程序第三次崩溃时 java.lang.IndexOutOfBoundsException: Index: 14, Size: 14 在 我不知道为什么,因为我在这个例子中是10,所以它检查索引14,它实际上是空的。它应该进入else循环,但它会崩溃。感谢您的帮助,下面是代码: String[] teile = tabelleninhalt.split("#"); ArrayList<String&g

我在使用ArrayList时遇到了问题,它会填充一个表格模型。 在第二个for循环中,应用程序第三次崩溃时

java.lang.IndexOutOfBoundsException: Index: 14, Size: 14

我不知道为什么,因为我在这个例子中是10,所以它检查索引14,它实际上是空的。它应该进入else循环,但它会崩溃。感谢您的帮助,下面是代码:

String[] teile = tabelleninhalt.split("#");
ArrayList<String> al = new ArrayList<String>();
        for (int i = 1; i < teile.length; i++) {
            al.add(teile[i]);

        }
        for (int i = 0; i < al.size(); i = i + 5) {
            if (al.get(i + 4)!=null) {
                tabModel.addRow(new Object[] { al.get(i), al.get(i + 1),
                        al.get(i + 2), al.get(i + 3), al.get(i + 4) });
            } else {
                tabModel.addRow(new Object[] { al.get(i), al.get(i + 1),
                        al.get(i + 2), al.get(i + 3) });
            }
        }
String[]teile=tabelleninhalt.split(“#”);
ArrayList al=新的ArrayList();
for(int i=1;i
否,当大小为14时,没有索引14。有效索引为0到13(包括0到13)

您的循环应该如下所示:

for (int i = 0; i < al.size() - 4; i += 5)
for(int i=0;i
如果你的列表中有5个条目,那么如果你有14个条目,听起来你就有问题了。大小不应该总是5的倍数吗

编辑:如果要将缺少的最终值视为有效的空值,但仍然需要前面的4个字段,则可能需要:

for (int i = 0; i < al.size() - 3; i += 5) {
    if (i + 4 < al.size() && al.get(i + 4) != null) {
        ... // Use al.get(i + 4)
    } else {
        ... // Don't use it
    }
}
for(int i=0;i

(但基于一个没有给出任何要求的问题很难判断。)

索引14是
数组列表的第15个元素。与大多数编程语言一样,Java中的数组(和
列表
s)是零索引的。

它不是空的,这个位置甚至不存在,这就是为什么会出现
索引自动边界异常
异常。

如果试图访问大于arraylist大小的位置,您将获得IOBE。您无法将该位置与null进行比较,因为该位置不可访问。最好检查大小而不是null。

听起来您的数组中只有14个项目,存储在索引0-13中。尝试访问索引14将导致异常。

问题是索引以0开头,最后一个元素的索引为13。因此,使用索引14访问它会抛出IndexOutOfBoundException

我很荣幸只落后@JonSkeet!11秒:数据填充到表中的字符串从文件中读取,某些部分可以保持打开状态,因此不必是5的倍数。您的解决方案无效,因为最后一行无法填写。但是无论如何thx:)@MaikFruhner:它不会抛出一个异常-当问题中没有指定这些要求时,很难给出满足这些要求的答案。你能将任何缺少的字段计算为有效的null吗?对我来说,这是有意义的,只有13个索引,但调试器说,14和15==null,我想我可以检查一下,这是真还是假。问题是,可以填写最后一个对象,但它可以保持打开状态。必须对此进行检查。@MaikFruhner:调试器可能显示了底层数组-它与逻辑列表不同。(基本上,这是一个实现细节)实际上它抛出了
IndexOutOfBoundsException
for (int i = 0; i < al.size() - 3; i += 5) {
    if (i + 4 < al.size() && al.get(i + 4) != null) {
        ... // Use al.get(i + 4)
    } else {
        ... // Don't use it
    }
}