我有一个带有 try 和 catch 块的方法,finally 语句后面的代码没有打印("结束"行)。
该方法抛出了一个异常,我怀疑这就是原因。 是线路的原因
System.out.println("end of a");
因为例外而不打印?
代码如下:
测试类:
public class Test
{
Integer num;
public Test(){
this(0) ;
System.out.println("Test constructor1 ");
}
public Test(int i){
if (i>0) num = new Integer(i) ;
System.out.println("Test constructor2 ");
}
public void a() throws Exception{
try{
if (num.intValue() > 0)
System.out.println("num = "+num.intValue());
System.out.println("executing a ");
throw new Exception();
}catch (Exception e){
System.out.println("exception caught in a");
if (e instanceof NullPointerException) throw e;
}
finally{
System.out.println("finally in a");
}
System.out.println("end of a");
}
}
主类:
public class MainTest2{
public static void main(String args[]){
try{
Test t2 = new Test();
t2.a();
System.out.println("executing main1 ");
}catch (Exception e){
System.out.println("exception caught in main");
}
System.out.println("ending main ");
}
}
一步一步:
- 当您在
t2
中调用a()
时,t2
中的num
值null
或未设置为其他含义 - 如果运行
if (num.intValue() > 0)
则会创建一个NullPointerException
(原因请参阅步骤 1) - 因此,发生的执行触发了
try
,它跳入catch
块,并通过e
向catch
块发出NPE
catch
块测试e
中的NPE
,这是真的,因此throw e
将执行传递给下一个实例a()
中的finally
块正在执行- 程序离开 try-catch-finally 块,同时从步骤 4 打开一个未处理的 exeption
- 步骤 6 触发
a()
声明中对throws Exception
的要求,因此a()
停止执行并将执行返回到main()
- 现在
main()
负责执行和运行
结论:
程序从未到达System.out.println("end of a");
行,因为它之前遇到了一个未处理的执行,抛出该行并停止执行a()
为该行。
(很抱歉拼写或语法错误:))
异常的主要原因NullPointerException
是由于num.intValue()
引起的。
因此,当出现异常时System.out.println("finally in a");
就会被执行。
在此之后,由于e
实际上是NPE
的一个实例,因此代码在执行他的片段代码时直接返回,if (e instanceof NullPointerException) throw e;
并且 rhe 最后sysout
永远不会执行。