为什么代码不会在"最后"?之后打印出来。 (JAVA)

时间:2018-04-02 15:44:44

标签: java exception-handling try-catch-finally

我有一个带try和catch块的方法,并且finally语句之后的代码没有打印(""行的结尾)。

该方法引发异常,我怀疑这是原因。 是行

的原因
var nodes = doc.getElementsByTagName("entry").item(0).children
for(...){
  ...
}

因为例外没有打印?

以下是代码:

  

测试类:

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");
    }
}

2 个答案:

答案 0 :(得分:1)

一步一步:

  1. 当您在a()中致电t2时,numt2的值为null或换句话说未设置
  2. 如果您运行if (num.intValue() > 0),则会创建NullPointerException(原因见第1步)
  3. 所以发生的exeption会触发try并跳转到catch区块,并通过NPEe区块提供catch < / LI>
  4. catchNPE的{​​{1}}块测试,这是真的,因此e将exeption传递给下一个实例
  5. throw e中的finally块正在执行
  6. 程序离开try-catch-finally块,同时从第4步打开unhandeled exeption
  7. 步骤6触发a()声明中throws Exception的要求,因此a()停止执行,并将该行为返回a()
  8. 现在main()负责执行和运行
  9. <强>结论:
    程序员永远不会到达行main(),因为它先前遇到了一个非变形的exeption,抛出了exeption并停止了执行行为System.out.println("end of a");

    (对不起拼写或语法错误:))

答案 1 :(得分:0)

由于NullPointerException导致异常的主要原因是num.intValue()
因此,当异常出现时System.out.println("finally in a");被执行 在此之后,由于e实际上是NPE的实例,因此代码会在执行其代码if (e instanceof NullPointerException) throw e;时直接返回 并且最后sysout从未执行过。