选项A:
public void method() {
try {
// some operation that throws FirstException
} catch (FirstException ex) {
throw new RuntimeException(ex);
}
try {
// some operation that throws SecondException
} catch (SecondException ex) {
throw new RuntimeException(ex);
}
}
选项B:
public void method() {
try {
// some operation that throws FirstException
// some operation that throws SecondException
} catch (FirstException ex) {
throw new RuntimeException(ex);
} catch (SecondException ex) {
throw new RuntimeException(ex);
}
}
哪一个更好,为什么?
答案 0 :(得分:2)
如果你的问题是关于表现,那么不,这两个选项都没有区别。它们都具有相同的处理开销,相同的编译时间(或多或少)。问题更多的是功能性和可读性。
当然选项B更具可读性。
但是如果你没有在catch块中抛出RuntimeException
,那么我建议使用选项A,因为在选项A中,即使抛出第一个异常,第二个操作也会执行。
After an exception is thrown from a try block the execution control will never return to the same try block.
但是在选项A中,因为两个操作都在一个单独的try块中,与选项B不同,所以不存在这样的问题。在第一次操作中遇到异常并处理它后,如果在选项A中编码许可,则可以继续进行第二次操作。
但是如果你坚持要从catch块中抛出RuntimeException
那么就像我说的那样,除了可读性之外,两种选择都没有区别。
答案 1 :(得分:0)
如果您没有在第一个选项中抛出RuntimeException(ex)
,那么第二次尝试也会执行。
在第二个选项中如果try
中的第一行抛出了FirstException
,它就不会执行try
块中的任何其他行..
答案 2 :(得分:0)
在选项A中,您将能够捕获两个例外。 在选项B中,当且仅当未抛出FirstException时,您将捕获SecondException
如果始终抛出FirstException,则表示无法访问的语句(SecondException的代码)。这不会生成编译器错误
答案 3 :(得分:0)
Luiggi是对的。 B更容易阅读。但是大卫说了一些非常重要的事情:既然我们没有区分异常处理你可以这样做:
public void method() {
try {
// some operation that throws FirstException
// some operation that throws SecondException
} catch (Throwable ex) {
throw new RuntimeException(ex);
}
}
鉴于我们不希望以不同方式处理未来的新异常。