打破 for 循环并在特定条件发生时抛出异常

Break a for loop AND also throw an exception when a specific condition is happening

所以我正在遍历一个帐户列表,我想为列表中的所有帐户打破整个 "for loop",同时在特定情况发生时抛出异常:

 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);
     }
}

有人有什么优雅的方法可以做到这一点吗? 也许用我自己的例外包装它并且在这种情况下只捕获它? 我的需求是否有良好且已知的做法? 感谢您的帮助,非常感谢!

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

  • 异常发生,被最里面的try捕获。
  • printError() 内容已完成。
  • 重新引发异常,这会杀死 forEach
  • 围绕 forEachtry 捕获重新引发的异常。

首先 - 在 forEach 中,您没有像传统 for loop 那样的 break 功能。所以如果你需要打破循环使用传统的 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 return 比 CustomeRuntimeException 正确,它将抛出并被 catch 块和 doA() & [=21= 捕获] 方法将在 catch 之后执行