这个问题在这里已有答案:
我正在学习OCA
考试,我在解决有关Java
异常的主题时发现了一个相互矛盾的观点。这是导致我混淆的代码:
public class StringOps {
public static void main(String[] args) {
System.out.print("a");
try {
System.out.print("b");
throw new IllegalArgumentException();
} catch (IllegalArgumentException e) {
System.out.print("c");
throw new RuntimeException("1");
} catch (RuntimeException e) {
System.out.print("d");
throw new RuntimeException("2");
} finally {
System.out.print("e");
throw new RuntimeException("3");
}
}
}
此代码输出:a-> b -> c -> e
。
但我不明白为什么?我认为它会输出:a-> b -> c -> d -> e
。
任何帮助将不胜感激!
之所以发生这种情况,是因为即使你在第一个拦截区域投掷了一个新的RuntimeException
,这个新的RuntimeException
仍然受到你的第一个拦截块的finally子句的约束。
如果你想要多次捕获,你必须嵌套你的尝试/捕获。控制流程始终是:
try --> catch --> finally.
希望这有帮助!