2016-12-04 6 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

Является ли ваше приложение запущенным в нескольких потоках и может ли преемник переоценки быть изменен из другой темы? Я ничего не вижу в вашем коде, что должно привести к исключению ArrayOutOfBoundsException, если есть только один поток. – Einar

+0

Вы уверены, что инициализация 'max' в' -10000' верна? Какой диапазон значений вы ожидаете 'successorEvaluations.get (i) .score' для хранения? – Eran

+0

Каково содержимое этого массива, против которого вы тестируете? –

ответ

1

best равно -1, что является незаконным индекс массива. Условие if не было выполнено.

0

Очевидно ваша переменная «лучше» не был установлен после инициализации .. это означает, что выражение если (макс < successorEvaluations.get (я) .score) дал каждый раз, когда «ложный» .. или, может быть, ваш ArrayList был пустой.

0

в случае, если наилучшее значение не изменяется в вашей логике (в цикле цикла), его значение останется неизменным, то есть -1. И -1 является незаконным индексом. Вот почему это исключение. Попробуйте изменить входные данные в своем arraylist и поместите условный оператор для обработки ошибок. как

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

FYI с Java 8 вы можете написать это гораздо проще

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

Вы могли бы рассмотреть возможность обработки пустое successorEvaluations, как это так ГЭТ() будет бросать 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(); 
} 
Смежные вопросы