2013-10-06 112 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!"); 
    } 
} 

索引超出界限的错误发生在for循环中,所以我不知道我哪里出错了。这是在Windows 8机器上进行测试而没有出现错误,但在Linux中实现时,每次出现索引越界错误时都会失败。

+2

你有一个堆栈跟踪?错误可能更深。 – zch

+0

您是否插入了打印语句以显示各个点处变量的状态并准确查看错误发生的位置? – abiessu

+2

无关提示:尝试通过提取一些局部变量来使代码更容易处理,速度更快:'Review review = reviewsMember.get(c1); Player player = Bukkit.getPlayer(review.getName());'等 – zch

回答

0

上述代码不能失败除非某些后台线程修改了循环中间的数组。这很可能是你的问题的原因。