下面是一个类问题,它传播异常处理机制,所需的输出是Exception。可以解释为什么输出是Exception,提前谢谢。
Class Question {
public void m1() throws Exception {
try {
m2();
} finally {
m3();
}
}
public void m2() throws RuntimeException {
throw new RuntimeException();
}
public void m3() throws Exception {
throw new Exception();
}
public static void main(String[] args) throws Exception {
Question q = new Question();
try {
q.m1();
} catch (RuntimeException re) {
System.out.println("RuntimeException");
} catch (Exception e) {
System.out.println("Exception");
}
}
答案 0 :(得分:1)
以下步骤作为程序执行的一部分发生:
(1)main()
来电m1()
(2)m1()
方法try
阻止调用m2()抛出RuntimeException
(3) m1()
方法finally
阻止调用m3()抛出Exception
(4)Exception
将被抛回调用方法main()
(5)在你的main()
方法中Exception
对象将被捕获并打印字符串“Exception”
关键是finally
块始终执行,即使Exception
(在您的代码中,try
块抛出RuntimeException
)抛出{{1}阻止。
如果在finally块中我调用m2()方法输出是什么?
在这种情况下,输出将是try
。
答案 1 :(得分:0)
所需的输出是异常。任何人都可以解释为什么输出 例外
因为finally
是在try
之后执行的最后一个块:
finally {
m3();
}
为此,您获得Exception
而非RuntimeException
答案 2 :(得分:0)
因为当执行finally语句时,会调用m3()
并抛出Exception
。
因此,即使在finally语句到达之前RuntimeException
上升,如果finally子句也引发另一个异常,则不会考虑RuntimeException
。
来自14.18. The throw Statement JLS:
如果有任何封闭的try语句(§14.20),其try块 包含throw语句,然后是那些try的任何finally子句 当控件向外传输时,执行语句,直到 抛出的价值被捕获。 注意突然完成一个终于 子句可以破坏投掷引发的控制权转移 言。强>
答案 3 :(得分:0)
以下是此问题的程序执行: -
。第一个main()方法是调用m1()
。 m1()方法try块正在调用m2(),它抛出RuntimeException
。然后m1()方法finally块调用m3()抛出异常
。并且异常将被抛回main()(调用方法)
。在main()方法中,将捕获并打印异常。