我似乎得到一个数组超出范围的异常,但问题是错误消息,我的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行
答案 0 :(得分:4)
在循环内部,您从列表中删除一个项目:
attributes.remove(splitAtt); // Line 75
第二次,对attributes.get(splitAtt)
的调用将引用列表中不再包含的索引。由于在进入循环之前尚未删除最后一个元素,因此打印语句会成功。
答案 1 :(得分:4)
我看到了整个代码。您正在使用attributes.remove(splitAtt)
从属性中删除元素,因为当条件的大小较小时,for条件会导致异常。
答案 2 :(得分:2)
您的打印输出有效,因为它们位于循环之前,并且异常不会出现在循环的第一次迭代中,而是出现在下一次循环中。
修改循环内的“属性”,从中删除元素。在下一次迭代中,当它想要检查循环条件时,它会失败。
也许您需要在循环之前将attributes.get(splitAtt)
存储在变量中,这样就可以避免在循环条件下访问attributes
。
如果你想确切地看到使用系统输出发生了什么,请尝试将它们放在循环的末尾,这样你就可以在每次检查循环条件时看到这些值。
答案 3 :(得分:0)
第一个数组的项目是否从0开始?
for(int attLoop = 0; attLoop < attributes.get(splitAtt); attLoop++){
我已离开java一段时间了,我可能错了。