出界异常

时间:2017-07-16 20:29:34

标签: java

我试图创建一个循环,它只迭代我所拥有的列表的一部分,但列表有时只放入一个或两个项目。我的目标是让它打印不超过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();
                }   
            }

据我所知,当列表中只有1或2个项目时,越界错误来自i&lt; 3,但循环仍在继续。我尝试了各种各样的东西,但我不太确定如何正确地做到这一点。

感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用Stream 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所需的值数,如果列表的大小较小,您将不会遇到任何问题。

答案 1 :(得分:1)

如果我理解正确,你只想打印较小的3和大小的次数?您可以在循环之前计算该数字,这样您只需要一个for循环:

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循环声明(假设第二个是你需要帮助的那个?):

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

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

减少重复代码量的另一个优化是计算循环次数,在for循环之外,只有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();
 }

为了可读性和调试而减少重复代码总是一个好主意,因为看起来你的循环都做同样的事情,最好像我上面那样重构你的代码以避免重复的代码。

答案 2 :(得分:-1)

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

if(allMatches.size()==i)break;
相关问题