core-java异常处理
下面是一个类问题,它是传播异常处理机制,期望的输出是异常。任何人都可以解释为什么输出是异常,提前感谢core-java异常处理,java,exception,Java,Exception,下面是一个类问题,它是传播异常处理机制,期望的输出是异常。任何人都可以解释为什么输出是异常,提前感谢 Class Question { public void m1() throws Exception { try { m2(); } finally { m3(); } } public void m2() throws RuntimeException { throw new RuntimeException(); }
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");
}
}
以下步骤是程序执行的一部分: (1)
main()
调用m1()
(2) m1()
methodtry
block调用m2(),它抛出RuntimeException
(3) m1()
方法最后
块调用m3(),它抛出异常
(4) Exception
将被抛出回调用方方法main()
(5) 在main()
方法中,将捕获对象Exception
并打印字符串“Exception”
关键点是,即使存在异常
(在代码中,try
块抛出try
块抛出RuntimeException
),也始终执行finally
块
如果在finally block中调用m2()方法,那么输出是什么
在这种情况下,输出将是RuntimeException
期望的输出是异常的。有人能解释为什么输出是异常的吗
例外情况
因为finally
是在try
之后执行的最后一个块:
finally {
m3();
}
因此,您得到的是
Exception
而不是RuntimeException
,因为当执行finally语句时,m3()
被调用并抛出Exception
。
因此,即使在finally语句到达之前出现了
RuntimeException
,如果finally子句还引发另一个异常,则不考虑RuntimeException
从:
如果有任何包含try语句(§14.20)的try块
包含throw语句,然后是那些try的任何finally子句
语句在控件向外传输时执行,直到
抛出的值被捕获注意,突然完成一个
子句可以中断由抛出启动的控制权转移
声明。
以下是该问题的程序执行情况:-- 。第一个main()方法调用m1() 。m1()方法try块正在调用引发RuntimeException的m2() 。然后m1()方法finally块调用m3(),它抛出异常 。异常将被抛出回main()(调用方方法)
。在main()方法中,异常将被捕获并打印。在异常处理中,无论try块是否发生天气错误,最终块都将强制执行 这里的
m1()
调用try块中的m2()
,而m2()
抛出RuntimeException
这里的控件返回到m1()
,使用RuntimeException
但最后在从try或catch块中重新调用控件之前,块将强制执行,这就是为什么m3()
由finally Block调用,而m3()
抛出Exception
,这里作为对m3()
抛出的Exception
的响应将由m1()
抛出。这就是为什么会出现Exception
和catch(Exception e)
块
最后,block强制执行。例如:
class Question {
public void m1() throws Exception {
try {
// control forworded to finally block(if Available) before returning from try or catch block.
return;
} finally {
m3();
}
}
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");
}
}
我希望它能帮助您理解异常处理,也能帮助您解决将来的问题。因为m1
抛出异常
如果在finally block中调用m2()方法,输出是什么?如果在finally block中调用m2()方法,输出是什么?RuntimeException不是正确的答案,即使异常被捕获或最终未被捕获也将被调用…如果异常被catch块捕获,它将执行catch块语句,然后执行finally blockyes,当然,catch
block(如果存在)将首先执行,然后执行finally