2013-10-06 5 views
0

Я пишу код на Java в качестве плагина на сервере Minecraft, но логические принципы носят общий характер.Ошибка индекса Java за пределами

public void doReviewMember(CommandSender playerSent) { 
    if (!reviewsMember.isEmpty()) { 
     Review doThis = null; 

     ArrayList<Review> players = new ArrayList<Review>(); 
     ArrayList<Review> playersVIP = new ArrayList<Review>(); 
     ArrayList<Review> playersVIPplus = new ArrayList<Review>(); 

     for (int c1 = 0; c1 < reviewsMember.size(); c1++) { 
      if (Bukkit.getPlayer(reviewsMember.get(c1).getName()).hasPermission("reviewplugin.vipplus")) 
       playersVIPplus.add(reviewsMember.get(c1)); 
      else if (Bukkit.getPlayer(reviewsMember.get(c1).getName()).hasPermission("reviewplugin.vip")) 
       playersVIP.add(reviewsMember.get(c1)); 
      else players.add(reviewsMember.get(c1)); 
     } 

     if (playersVIPplus.size() > 0) 
      doThis = playersVIPplus.get(0); 
     else if (playersVIP.size() > 0) 
      doThis = playersVIP.get(0); 
     else doThis = players.get(0); 

     Bukkit.getPlayer(playerSent.getName()).sendMessage("§4[§6ReviewPlugin§4] §eThis review is for §b" + doThis.getName()); 
     Bukkit.getPlayer(playerSent.getName()).teleport(doThis.getLocation()); 
     reviewsMember.remove(doThis); 
     if (reviewsMember.size() > 1) 
      Bukkit.getPlayer(playerSent.getName()).sendMessage("§4[§6ReviewPlugin§4] §eThere are " + reviewsMember.size() + " member reviews left to do."); 
     else if (reviewsMember.size() == 1) 
      Bukkit.getPlayer(playerSent.getName()).sendMessage("§4[§6ReviewPlugin§4] §eThere is " + reviewsMember.size() + " member review left to do."); 
     else 
      Bukkit.getPlayer(playerSent.getName()).sendMessage("§4[§6ReviewPlugin§4] §eThere are no more Member reviews to do at this time!"); 
    } 
    else { 
     Bukkit.getPlayer(playerSent.getName()).sendMessage("§4[§6ReviewPlugin§4] §eThere are no more Member reviews to do at this time!"); 
    } 
} 

Индекс из оценки точности происходило в течение цикла, так что я понятия не имею, где я неправильно. Это было протестировано без ошибок на компьютере под управлением Windows 8, но когда оно было внедрено в Linux, он каждый раз сбой с ошибкой индекса за пределами границ.

+2

У вас есть стек? Ошибка, вероятно, глубже. – zch

+0

Вы вставили операторы печати, чтобы показать состояние переменных в разных точках и посмотреть, где именно происходит ошибка? – abiessu

+2

Несвязанный намек: попробуйте сделать код более удобным для работы и быстрее, извлекая некоторые локальные переменные: 'Review review = reviewsMember.get (c1); Player player = Bukkit.getPlayer (review.getName()); 'и т. Д. – zch

ответ

0

Приведенный выше код не может потерпеть неудачу , если некоторая фоновая нить изменяет массив в середине цикла. Скорее всего, это причина вашей проблемы.

Смежные вопросы