2016-12-04 73 views
-3

我每次運行以下方法時都會收到錯誤。即使列表不爲空,錯誤依然存在。不尋常的ArrayIndexOutOfBoundsException錯誤

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

您的應用程序是否在多個線程中運行,並且可以通過其他線程更改successorEvaluations?如果只有一個線程,則在代碼中看不到任何應該導致ArrayOutOfBoundsException的任何內容。 – Einar

+0

你確定將'max'初始化爲'-10000'是否正確?你期望'successorEvaluations.get(i).score'能保持什麼樣的數值範圍? – Eran

+0

你正在測試的這個數組的內容是什麼? –

回答

1

best是-1,這是一個非法數組索引。 if條件未滿足。

0

顯然你的變量「最好」沒有設置初始化後..這意味着,表達 IF(MAX < successorEvaluations.get(I).score) 給了每一次「假」 .. 或者你的ArrayList是空。

0

如果您的邏輯中沒有更改最佳值(在for循環中),其值將保持不變,即-1。 -1是非法索引。那就是爲什麼這個例外。 嘗試更改您的數組列表中的輸入數據,並將條件語句用於錯誤處理。像

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

僅供參考使用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(); 
} 
相關問題