不寻常的ArrayIndexOutOfBoundsException错误

时间:2016-12-04 20:32:12

标签: java arraylist error-handling indexoutofboundsexception

每次运行以下方法时都会出现错误。即使列表不为空,错误仍然存​​在。

public Position getBestMove() {
    int max = -10000;
    int best = -1;
    System.out.println("CALLED");
    System.out.println(successorEvaluations.size());
    // iterate over successors and return the one with the highest eval result
    for (int i = 0; i < successorEvaluations.size(); i++) { 
        if (max < successorEvaluations.get(i).score) {
            max = successorEvaluations.get(i).score;
            best = i;
        }
    }
    return successorEvaluations.get(best).pos;
}

错误输出:

java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at Board.getBestMove(Board.java:151)

4 个答案:

答案 0 :(得分:1)

best是-1,这是一个非法的数组索引。 if条件未得到满足。

答案 1 :(得分:0)

显然你的变量'best'在初始化后没有设置..它意味着表达式 if(max&lt; successorEvaluations.get(i).score) 每次'假'都给了.. 或者你的ArrayList是空的。

答案 2 :(得分:0)

如果你的逻辑中没有改变最佳值(在for循环中),它的值将保持不变,即-1。 -1是非法索引。这就是为什么这个例外。 尝试更改arraylist中的输入数据并输入条件语句以进行错误处理。像

if(best == -1){
 return null;// or some default Position as per your requirements
}

答案 3 :(得分:0)

使用java 8的FYI,你可以写得更简单

           fragmentSeperateCLass.onStartFragment(getContext(), getChildFragmentManager(), FirstChildFragment.class.getName(),
                    R.id.firstChildFragmentLayout);
        }

你可以考虑处理一个空的successorEvaluations,就像这样,因为如果list是空的,get()会抛出一个NullpointerException:

public Position getBestMove() {
   return successorEvaluations.stream().max(s -> s.score()).get().pos();
}

或返回默认值

public Position getBestMove() {
   return successorEvaluations.stream()
                              .max(s -> s.score())
                              .orElseThrow(new BestMoveNotFoundException())
                              .pos();
}