越界异常

问题描述:

我正在尝试创建一个循环,它只能遍历列表的一部分,但列表有时只有一个或两个项目放入它。无论循环中有多少物品,我的目标是打印不超过3个结果。越界异常

if (event.getMessage().getContent().startsWith("!!")) { 
       for (int i=0; i<allMatches.size(); i++) { 
        event.getTextChannel().sendMessage((i+1)+".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
          .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
       } 
      } 
      else { 
       for (int i=0; i<3; i++) { 
        event.getTextChannel().sendMessage((i+1)+".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
          .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
       } 
      } 

据我所知,出界失误从我< 3来当列表只中有1个或2项,但循环不断去反正。我尝试了各种各样的东西,但我不太清楚如何正确地做到这一点。

谢谢。

+3

欢迎来到Stack Overflow!它看起来像你需要学习使用调试器。请帮助你一些补充性的调试技术。如果您之后仍然遇到问题,请随时返回一个显示您的问题的[最小化,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

如果我正确理解你,你只是想打印3和尺寸的较小的次数?你可以计算出之前,你的循环,即号码,这样你只需要一个for循环,而不是:(?假设2号上的是你需要帮助的)

if (event.getMessage().getContent().startsWith("!!")) { 
for (int i = 0; i < allMatches.size(); i++) { 
    event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
    .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
} 

} else { 
for (int i = 0; i < Math.min(3, allMatches.size()); i++) { 
    event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
    .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
} 
} 

我改变了对循环声明:

for (int i = 0; i < Math.min(3, allMatches.size()); i++)

所以现在它会运行3或allMatches.size()次数,以较小者为准。


另一种优化,以减少重复的代码量是计算的时间循环次数,您之外循环,并只有1个循环:

int loops = Math.min(3, allMatches.size()); 
if (event.getMessage().getContent().startsWith("!!")) 
    loops = allMatches.size(); 

for (int i = 0; i < loops; i++) { 
    event.getTextChannel().sendMessage((i + 1) + ".\\) " + allMatches.get(i).replace("\"", "").replace(",", "; ") 
    .replace("[", " ").replace("]", "").replace("english_definitions:", "")).queue(); 
} 

它始终是一个好主意为了减少重复代码的可读性和调试性,并且由于它们看起来都是循环执行相同的事情,所以最好像上面所做的那样重构代码以避免重复的代码。

+0

谢谢。我对编程还很陌生,但我知道必须有一种优化方法。 – PierceJ

+0

没问题,希望我说的是有道理的 – Chris

在第二个循环中添加一个if子句。

if(allMatches.size()==i)break; 

您可以使用流API来解决这个问题:

AtomicInteger num = new AtomicInteger(1);// use this for string number 
allMatches.stream().limit(3).forEach(value -> event.getTextChannel() 
    .sendMessage(num.getAndIncrement()+".\\)"+value.replace("\"", "") 
    .replace(",", "; ").replace("[", " ") 
    .replace("]", "").replace("english_definitions:", "")).queue() 
); 

有了限制方法,你可以遍历thrue只需要值的数量,如果列表的大小不,你不会得到任何问题。

+2

还请添加一些解释,而不仅仅是一堆代码行。按照目前的形式,这对OP来说并不是非常有帮助,因为它可以理解这个问题,为什么这是一个解决方案。 – Zabuza