try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
一,
package demo; public class tryDemo { private static int see(){ int s = 0; try{ s +=2; System.out.println("执行完try"); return s; }catch(Exception e){ return s+1; }finally{ System.out.println("执行完finally"); } } public static void main(String[] args) { int a = see(); System.out.println("a : "+ a ); } }
运行结果:
执行完try
执行完finally
a : 2
说明,如果 try当中有return 的话, 先执行完return中的语句,在执行finally中的语句,最后 返回 try 中的 return。
二,如果 finally当中也有 return呢 ?
package demo; public class tryDemo { private static int see(){ int s = 0; try{ s +=2; System.out.println("执行完try"); return s; }catch(Exception e){ return s+1; }finally{ System.out.println("执行完finally"); return s+3; } } public static void main(String[] args) { int a = see(); System.out.println("a : "+ a ); } }
输出结果:
执行完try
执行完finally
a : 5
说明: 这种情况下,不执行 try当中的 return ,最后返回的是 finally 中的值 。
三 ,
如果 try当中有 return s,
finally没有 return, 但在 finally 中 有 对 s 的操作,那么 try 当中的 return s 是 更改后的 s 吗?
package demo; public class tryDemo { private static int see(){ int s = 0; try{ s +=2; System.out.println("执行完try"); return s; }catch(Exception e){ return s+1; }finally{ System.out.println("执行完finally"); s +=1; //s=5; } } public static void main(String[] args) { int a = see(); System.out.println("a : "+ a ); } }
输出结果:
执行完try
执行完finally
a : 2
说明, finally当中的 对 s 的修改 并不对 try当中的 return 值产生影响。
四,针对 int类型 和 List 类型的一个小区别
1,针对 int 类型
package tuling; import java.util.ArrayList; import java.util.List; public class ErrorAndThr0 { public static void main(String[] args) { int a = test(); System.out.println("a = "+ a); } private static int test(){ int i = 0; try{ i++; System.out.println("try block,i = " + i); return i; }catch(Exception e){ i++; System.out.println("catch block , i = "+ i ); return i; }finally{ i++; System.out.println("finally block, i = "+ i); } } }
输出结果:
try block,i = 1 finally block, i = 2 a = 1
我们看下.class文件反编译的源代码:
当然 ,红色 的部分 还未得到证实, 我是看 03-Exception和Error的区别-杨过 的 第 16分钟 是这么说的 。
2, 针对 List 类型
package tuling; import java.util.ArrayList; import java.util.List; public class ErrorAndThr { public static void main(String[] args) { List <String> list = test(); System.out.println("list : "+ list.toString()); } private static List test(){ List <String> list = new ArrayList<String>(); try{ list.add("step try"); System.out.println("try block"); return list; }catch(Exception e){ list.add("step catch"); System.out.println("catch block"); return list; }finally{ list.add("step finally"); System.out.println("finally block"); } } }
输出结果:
try block finally block list : [step try, step finally]
我们看下.class文件反编译的源代码:
说明,针对 list类型,finally类型的操作会影响 try 当中return的结果。
posted on 2020-07-16 12:53 William_Dai 阅读(839) 评论(0) 编辑 收藏 举报