Java 1.6 java.lang.IndexOutOfBoundsException问题

时间:2010-10-16 19:47:40

标签: java exception arraylist

我似乎得到一个数组超出范围的异常,但问题是错误消息,我的System.out和eclipse的调试工具告诉我相互矛盾的信息。

这是我的例外:

  

线程“main”中的异常   java.lang.IndexOutOfBoundsException:   指数:9,大小:9
          在java.util.ArrayList.RangeCheck(ArrayList.java:547)
          在java.util.ArrayList.get(ArrayList.java:322)
          在InduceC45.C45(InduceC45.java:61)
          在InduceC45.main(InduceC45.java:15)

InduceC45中的第61行是:

for(int attLoop = 1; attLoop <= attributes.get(splitAtt); attLoop++){

这就是说splitAtt超出了ArrayList属性的界限,这很简单。

所以我尝试使用调试器,我也尝试使用一些System.out来试图弄清楚发生了什么,它们基本上给了我相同的信息,所以这里是System.out的

System.out.println("splitAtt="+splitAtt);
System.out.println("attributes="+attributes);
System.out.println("attributes="+attributes.get(splitAtt));

这打印出来的结果如下:

  

splitAtt = 9
属性= [3,3,3,2,   3,6,3,4,4,2]
属性= 2

我真的不明白为什么我可以引用它而不会出现错误,如果它不在循环中。我认为我没有做任何棘手的事情,让我知道是否有人能想到可能的原因。

如果有人想要完整的资源...... http://github.com/Ryuho/CSC466/blob/master/lab3/src/InduceC45.java第61行

4 个答案:

答案 0 :(得分:4)

在循环内部,您从列表中删除一个项目:

attributes.remove(splitAtt); // Line 75

第二次,对attributes.get(splitAtt)的调用将引用列表中不再包含的索引。由于在进入循环之前尚未删除最后一个元素,因此打印语句会成功。

答案 1 :(得分:4)

我看到了整个代码。您正在使用attributes.remove(splitAtt)从属性中删除元素,因为当条件的大小较小时,for条件会导致异常。

答案 2 :(得分:2)

  1. 您的打印输出有效,因为它们位于循环之前,并且异常不会出现在循环的第一次迭代中,而是出现在下一次循环中。

  2. 修改循环内的“属性”,从中删除元素。在下一次迭代中,当它想要检查循环条件时,它会失败。

  3. 也许您需要在循环之前将attributes.get(splitAtt)存储在变量中,这样就可以避免在循环条件下访问attributes

    如果你想确切地看到使用系统输出发生了什么,请尝试将它们放在循环的末尾,这样你就可以在每次检查循环条件时看到这些值。

答案 3 :(得分:0)

第一个数组的项目是否从0开始?

for(int attLoop = 0; attLoop < attributes.get(splitAtt); attLoop++){

我已离开java一段时间了,我可能错了。