中断for循环,并在发生特定情况时引发异常

时间:2020-02-10 20:17:51

标签: for-loop exception java-8 break throw

所以我要遍历一个帐户列表,我想破坏该列表中所有帐户的整个“ for循环”,同时还要在发生某种情况的同时抛出异常:

 accounts.forEach(account -> {
     try {
         if (isSomethingHappens()) {
             String errorMsg = "bla bla, you can't do that cuz condition is happening";
             printError(errorMsg);
             throw new Exception(errorMsg); // AND I also, in addition to the exception, I wanna break the whole loop here
         }
         doA();
         doB();

     } catch (Exception e) {
         printError(e);
     }
}

有人能做到这一点吗? 也许用我自己的例外包装它,并在这种情况下只抓住它? 我的需求是否有良好的已知做法? 感谢您的帮助,并非常感谢!

2 个答案:

答案 0 :(得分:1)

第一件事-在forEach中,您没有像传统break那样的for loop功能。因此,如果您需要中断循环,请使用传统的for loop 在Java中,lambda表达式只能抛出运行时异常 因此,您可以做的一件事是创建CustomeRuntimeException并将forEach循环包装在try catch块中

 try {
    accounts.forEach(account -> {
       if (isSomethingHappens()) {
           throw new CustomeRuntimeException("bla bla, you can't do that cuz condition is happening");
        }
     }
 } catch (CustomeRuntimeException e) {
    printError(e);
 }
    doA();
    doB();
}

如果isSomethingHappens返回值大于CustomeRuntimeException会抛出异常并被catch块捕获,并且doA()doB()方法将在catch之后执行

答案 1 :(得分:0)

执行此操作的一种好方法是重新引发内部catch块中的错误。这将把控制权交给下一个外部try / catch。因此,将另一个try / catch块放在您的foreach构造之外。

  • 发生异常,并且被最里面的try捕获。
  • printError()的工作完成了。
  • 重新引发异常,这会杀死forEach
  • try周围的forEach捕获了重新引发的异常。