每次运行以下方法时都会出现错误。即使列表不为空,错误仍然存在。
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)
答案 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();
}