trycatchfinally用法总结
Posted oldthree3
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了trycatchfinally用法总结相关的知识,希望对你有一定的参考价值。
try、catch、finally用法总结:
1、不管有没有异常,finally中的代码都会执行
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
执行顺序
1.
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test()); 4 } 5 public static int test(){ 6 int i = 1; 7 try{ 8 i++; 9 System.out.println("try block, i = "+i); 10 }catch(Exception e){ 11 i ++; 12 System.out.println("catch block i = "+i); 13 }finally{ 14 i = 10; 15 System.out.println("finally block i = "+i); 16 } 17 return i; 18 }
结果输出如下:
try block, i = 2
finally block i = 10
10
先执行try块,并没有捕获到异常,finally 块,最后return。
2.当我们把return放到try块中和catch块中,会怎么样呢?你们会不会纠结先return呢还是先finally呢?返回值i会改变吗?
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test()); 4 } 5 public static int test(){ 6 int i = 1; 7 try{ 8 i++; 9 System.out.println("try block, i = "+i); 10 return i; 11 }catch(Exception e){ 12 i ++; 13 System.out.println("catch block i = "+i); 14 return i; 15 }finally{ 16 i = 10; 17 System.out.println("finally block i = "+i); 18 } 19 }
结果输出如下:
try block, i = 2
finally block i = 10
2
如我们总结一样:
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
3.如果是操作不是基本类型会怎么样?会不一样吗?为什么?
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test().mmp("fuck")); 4 } 5 public static Person test(){ 6 Person person = new Person(); 7 try{ 8 person.setShengao("172cm"+"---try block"); 9 System.out.println("try block"); 10 return person; 11 }catch(Exception e){ 12 person.setTizhong("100kg"); 13 System.out.println("catch block"); 14 return person; 15 }finally{ 16 person.setXingbie("女"); 17 System.out.println("finally block "); 18 } 19 }
Person类
1 package xyz; 2 3 public class Person { 4 public String shengao; 5 public String tizhong; 6 public String xingbie; 7 8 //public String hello(String input); 9 10 public String getShengao() { 11 return shengao; 12 } 13 14 public void setShengao(String shengao) { 15 this.shengao = shengao; 16 } 17 18 public String getTizhong() { 19 return tizhong; 20 } 21 22 public void setTizhong(String tizhong) { 23 this.tizhong = tizhong; 24 } 25 26 public String getXingbie() { 27 return xingbie; 28 } 29 30 public void setXingbie(String xingbie) { 31 this.xingbie = xingbie; 32 } 33 34 35 public String mmp(String fuck){ 36 System.out.println("person : mmp"); 37 System.out.println("shengao:"+this.shengao); 38 System.out.println("tizhong:"+this.tizhong); 39 System.out.println("xingbie:"+this.xingbie); 40 return fuck; 41 } 42 43 }
结果输出如下:
try block
finally block
person : mmp
shengao:172cm---try block
tizhong:null
xingbie:女
fuck
从上面可以看出,在finally中的set的性别 女 生效了,而在之前用基本类型,在finally中修改它的值不生效。为什么呢?
我们知道基本类型在栈中存储,而对于非基本类型是存储在堆中的,返回的是堆中的地址,因此内容被改变了。
4.如果在finally加入return,会怎么样? 如果在finally 抛出了异常呢?
在finally中存在return,会有黄色警告:finally block does not complete normally 意思是finally代码块不能正常完成。
就不贴代码了,有兴趣的自己试试吧。
《完》
finally中有return 会出现警告finally block does not complete normally
以上是关于trycatchfinally用法总结的主要内容,如果未能解决你的问题,请参考以下文章
JAVA中trycatchfinally带return的执行顺序总结