【问题标题】:Unusual ArrayIndexOutOfBoundsException error异常的 ArrayIndexOutOfBoundsException 错误
【发布时间】:2016-12-04 20:32:12
【问题描述】:

每次运行以下方法时,我都会收到错误消息。即使列表不为空,错误仍然存​​在。

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)

【问题讨论】:

  • 您的应用程序是否在多个线程中运行,并且可以从另一个线程更改 successorEvaluations 吗?如果只有一个线程,我在您的代码中看不到任何会导致 ArrayOutOfBoundsException 的内容。
  • 您确定将max 初始化为-10000 是正确的吗?您预计successorEvaluations.get(i).score 的值范围是多少?
  • 您要测试的这个数组的内容是什么?

标签: java arraylist error-handling indexoutofboundsexception


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    很明显你的变量'best'在初始化后没有设置..这意味着表达式 if (max

    【讨论】:

      【解决方案3】:

      如果您的逻辑(在 for 循环中)未更改最佳值,则其值将保持不变,即 -1。 -1 是非法索引。这就是为什么这个例外。 尝试更改数组列表中的输入数据并放置条件语句以进行错误处理。喜欢

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

      【讨论】:

        【解决方案4】:

        仅供参考,使用 java 8 你可以写得更简单

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

        您可以考虑处理一个空的successorEvaluations,因为如果列表为空,get() 将抛出 NullpointerException:

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

        或者返回一个默认值

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

        【讨论】:

          猜你喜欢
          • 2016-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-24
          • 2013-07-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多