标签:资源 hash 异常 turn oid pac data this 实例变量
Java编程中。常常会使用到异常处理,而finally看似的是try/catch后对逻辑处理的完好,事实上里面却存在非常多隐晦的陷阱。final常见于变量修饰,那么你在内部类中也见过吧。finalize作为GC回收对象前的一道门,什么时候运行。运行效果又是如何。有时看看又忘了。以下是我总结网上朋友的一些博文及其帖子对三者进行总结。(重点讲下finally)
先看final
结果受finally操作影响
package java_zhaohuaxishi; public class Example1 { public int test(){ int i = 0; try{ i = 10; System.out.println("try"); return i+=10; }catch(Exception e){ i = 20; return 200; }finally{ System.out.println("finally"); System.out.println(i); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(new Example1().test()); } }执行结果:
try finally 20 20这也意味着finally打印出来的是try中return已经计算了的,验证观点一。
package java_zhaohuaxishi; public class Example1 { public int test(){ int i = 0; try{ i = 10; return 100; }catch(Exception e){ i = 20; return 200; }finally{ return i; } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(new Example1().test()); } }上述时没有出现异常情况,打印例如以下:
10
package java_zhaohuaxishi; public class Example2 { public int test(){ int i = 0; try{ i = 10/0; return 100; }catch(Exception e){ i = 20; return 200; }finally{ return i; } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(new Example2().test()); } }打印结果例如以下:
20结果是:不管出现异常与否,finally的return总会覆盖try/catch中return的结果。验证观点二。
package java_zhaohuaxishi; public class Example5 { public int test(){ int i = 0; try{ i = 10; return i; }catch(Exception e){ i = 20; return i; }finally{ i=30; //return i; } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(new Example5().test()); } }打印结果例如以下:
10能够看到。实际上finally改动i变量是不起作用的。验证观点三。
package java_zhaohuaxishi; class Test{ int num; public Test(int num){ this.num = num; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } } public class Example3 { public Test test(){ Test t = new Test(0); try{ t.setNum(10); return t; }catch(Exception e){ t.setNum(20); return t; }finally{ t.setNum(30); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(new Example3().test().getNum()); } }打印结果例如以下:
30从上述结果来看,finally操作的对象确实是与try上的同一个对象。那么我们比較上面观点三,操作变量的时候是不能更改的,想想有点诡异。我们看以下代码:
package java_zhaohuaxishi; class Test{ int num; public Test(int num){ this.num = num; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } } public class Example3 { public int test(){ Test t = new Test(0); try{ t.setNum(10); System.out.println(t.getNum()); return t.getNum(); }catch(Exception e){ t.setNum(20); return t.getNum(); }finally{ System.out.println(t.getNum()); t.setNum(30); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(new Example3().test()); } }这次我们不在返回对象。而是返回一个int变量。从观点一我们能够知道,返回的t.getNum()实际上是会先计算再保存起来。那么假设我们在finally中在去改变t的num,实际上t的num会被改变,然而返回的应该还是10。
10 30 10果然!这与我们预先的是一模一样。假设有人认为finally中t对象可能与try中不一致。以下样例将会让你认为非常奇妙:
package java_zhaohuaxishi; class Test4{ int num; public Test4(int num){ this.num = num; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } } public class Example4 { public Test4 test(Test4 t){ System.out.println("传进去的t:"+t.hashCode()); try{ t.setNum(10); return t; }catch(Exception e){ t.setNum(20); return t; }finally{ //t.setNum(30); System.out.println("finally改动前:"+t.hashCode()); t = new Test4(0); System.out.println("finally改动后:"+t.hashCode()); //return t; } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Test4 t = new Test4(0); System.out.println("return返回对象"+new Example4().test(t).hashCode()); System.out.println("最后的t:"+t.hashCode()); } }
传进去的t:2004703190 finally改动前:2004703190 finally改动后:1175576547 return返回对象2004703190 最后的t:2004703190这结果看起来非常奇妙。我们验证观点四的时候操作对象是起作用的!然而当我们试图去改动t引用让他指向其它对象的时候居然无效......
朝花夕拾——finally/final/finalize拨云雾见青天
标签:资源 hash 异常 turn oid pac data this 实例变量
原文地址:http://www.cnblogs.com/blfbuaa/p/6915692.html