读书人

有关Java错误处理中包含return语句的t

发布时间: 2013-02-24 17:58:56 作者: rapoo

有关Java异常处理中包含return语句的try和finally执行顺序的实证
public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(get());}public static boolean get() {try {System.out.println("try");return true;} catch (Exception e) {e.printStackTrace();} finally {System.out.println("finally");}return false;}

?

果然打印结果为:

try
finally
true

?

????????但是上午写代码的时候碰到个情况,try语句中最后要return一个值,return语句里面引用到一个对象,但是要在finally中清理掉这个对象,心想这要是按照上面的执行顺序,岂不是在return的时候就会报空指针的错误了,于是尝试了一下。

?

class C {int c = 100;int get() {return c;}}

?

public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(get());}public static boolean get() {C c = null;try {c = new C();System.out.println("try");return (c.get() == 100);} catch (Exception e) {e.printStackTrace();} finally {c = null;System.out.println(c);System.out.println("finally");}return false;}

?

发现打印结果为:

try
null
finally
true

?

???????可见finally确实在try块之后,try中return之前执行了,并且将对象变成null,但是貌似并没有影响try块中return语句的执行结果。表面上貌似跟上面第一个测试的结果相悖了。于是猜想是不是return语句执行结束之后,把执行的结果存放在某个地方了,等到finally执行完毕再把值取出,return出来。

?

???????于是重新尝试在finally中return值

public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(get());}public static boolean get() {C c = null;try {c = new C();System.out.println("try");return (c.get() == 100);} catch (Exception e) {e.printStackTrace();} finally {c = null;System.out.println(c);System.out.println("finally");return false;}//return false;}

?

执行结果为

try
null
finally
false

??????? 因为finally中的return语句,替换掉了在try中return保存的值。

??????? 所以在finally中把对象进行销毁,是不用担心try中return语句的执行结果,因为这个结果在开始执行finally之前就已经保存下来了,只是在finally执行完毕之后重新取出之前保存的值,再return出来

?

读书人网 >编程

热点推荐