所以我要遍历一个帐户列表,我想破坏该列表中所有帐户的整个“ 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);
}
}
有人能做到这一点吗? 也许用我自己的例外包装它,并在这种情况下只抓住它? 我的需求是否有良好的已知做法? 感谢您的帮助,并非常感谢!
答案 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
捕获了重新引发的异常。