抛出Java IndexOutOfBoundsException,不确定为什么

时间:2013-12-06 02:25:15

标签: java exception

这是我的代码:

import java.util.ArrayList;

public class PostmanProblem {
    public static void main(String[] args) {
        //Make the ArrayList and fill it
        ArrayList<Door> al = new ArrayList<Door>();
        for(int i = 0; i<=9; i++){
            al.add(new Door("closed", i));
        }

        //Do the problem
        for (int i = 1; i < 100; i++){
            for (int n = i; n < 100; n+=i){
                if (al.get(n).isClosed()){
                    al.get(n).open();
                }
                else
                {
                    al.get(n).close();    
                }
            }
        }

        for(Door d : al){
            System.out.print(d.toString() + "\t");
        }
    }
}

我不知道为什么,但我得到以下例外:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 10, Size: 10
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at PostmanProblem.main(PostmanProblem.java:15)

它引用的行是嵌套for循环中if语句的开头。 Door类具有返回布尔值的isClosed()方法,以及返回布尔值的isOpen()方法。它具有void函数open()和close(),它将其状态更改为打开或关闭。 Door的构造函数是Door(String state,int id)。希望这就是你所需要的一切。提前谢谢!

3 个答案:

答案 0 :(得分:1)

这就是事情:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 10, Size: 10
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at PostmanProblem.main(PostmanProblem.java:15)

这为您提供了大量的信息。

  • PostmanProblem.java的第15行。那里发生了什么?
  • java.util.ArrayList.get,您在.get上调用的ArrayList方法存在问题。
  • java.lang.IndexOutOfBoundsException: Index: 10, Size: 10

这是一个很多信息,它使问题难以解决。

首先,转到发生错误的行。查看您尝试访问的索引。根据程序实际应该做什么,您是否正在访问正确的索引?或者你在这里犯了一个逻辑错误?您是否应该能够访问此数组的索引以获取该程序的预期功能?

如果不应该访问此索引,那么您的错误就在这里。您需要修复控制正在访问的索引的逻辑。但是,如果这是一个应该能够访问的索引,那么问题是你没有使ArrayList足够大。因此,现在您需要转到已设置ArrayList的代码部分,并找出您在此处所做的逻辑错误以及为什么ArrayList没有那么大你想要它。


for(int i = 0; i<=9; i++){
    al.add(new Door("closed", i));
}

这是您将值加载到al的位置。您输入了十个值。它们位于索引09

for (int i = 1; i <= 100; i++){
   for (int n = i; n <= 100; n+=i){
       if (al.get(n).isClosed()){
           al.get(n).open();
       } else {
           al.get(n).close();    
       }
   }
}

这是你走出界限的地方。你试图进入指数10(以及超越),但你的最大指数是9。

答案 1 :(得分:0)

看起来你只需要在ArrayList al中添加10个项目,并期望找到100 ??

 ArrayList<Door> al = new ArrayList<Door>();
 for(int i = 0; i<=9; i++){
      al.add(new Door("closed", i));
 }

然而

 for (int n = i; n <= 100; n+=i){
    if (al.get(n).isClosed()){
         al.get(n).open();
    }

暗示n将是&gt; 9在某个阶段

答案 2 :(得分:0)

您的ArrayList al的大小为10(从索引0到9),但您尝试访问1到100。 所以当循环在n == 10时,它超出界限。