为什么代码在"finally"后没有打印该行?(爪哇)



我有一个带有 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 ");
}
}

一步一步:

  1. 当您在t2中调用a()时,t2中的numnull或未设置为其他含义
  2. 如果运行if (num.intValue() > 0)则会创建一个NullPointerException(原因请参阅步骤 1)
  3. 因此,发生的执行触发了try,它跳入catch块,并通过ecatch块发出NPE
  4. catch块测试e中的NPE,这是真的,因此throw e将执行传递给下一个实例
  5. a()中的finally块正在执行
  6. 程序离开 try-catch-finally 块,同时从步骤 4 打开一个未处理的 exeption
  7. 步骤 6 触发a()声明中对throws Exception的要求,因此a()停止执行并将执行返回到main()
  8. 现在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永远不会执行。

相关内容

  • 没有找到相关文章

最新更新