我有一个带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");
}
}
答案 0 :(得分:1)
一步一步:
a()
中致电t2
时,num
中t2
的值为null
或换句话说未设置if (num.intValue() > 0)
,则会创建NullPointerException
(原因见第1步)try
并跳转到catch
区块,并通过NPE
向e
区块提供catch
< / LI>
catch
中NPE
的{{1}}块测试,这是真的,因此e
将exeption传递给下一个实例throw e
中的finally
块正在执行a()
声明中throws Exception
的要求,因此a()
停止执行,并将该行为返回a()
main()
负责执行和运行 <强>结论:强>
程序员永远不会到达行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
从未执行过。