java catch之后走return_理清Java中try-catch-finally带return的执行顺序

前言:try-catch-finally带return和异常时,它们之间执行顺序问题是留下来的一个小疑问,今天搞清楚它们

第一种情况:无异常

//1.try-catch-finally都带有return

public static intmethod_1(){int num = 1;try{

System.out.println("---try run---");return ++num;

}catch(Exception e) {

System.out.println("---catch run---");return --num;

}finally{

num= 10;

System.out.println("---finally run---");//return num;

}

}

没有异常,程序执行完try代码块中的内容最后执行finally中的代码,输出结果为下:

10ee3dd9172c1b21bfcf98532bed01fc.png

1.1:可能会有所疑惑:为什么在finally块中对num值进行了修改,输出的依然是2?

原因是:jdk走到try中的return时,将需要return的值放到了一个临时存储区中去,虽然finally中对num值进行了修改,并不会影响返回结果,返回的依然是临时存储区的那

1.2: 当将finally代码块中的return注释去掉,返回值为什么为10?

原因是:无论是在try或者是catch中进行了return,最后都会执行finally中的代码,如果在finally中进行了return,则函数到此就退出了。

第二种情况:有异常

public static intmethod_2(){int num = 1;try{

num= num/0;

System.out.println("---try run---");return ++num;

}catch(Exception e) {

System.out.println("---catch run---");return --num;

}finally{

num= 10;

System.out.println("---finally run---");//return num;

}

}

输出结果如下:

703871b38e551c08243faa05397a6249.png

其实也很简单理解:执行try中的代码块到num=num/0,发现有错被catch捕捉到,执行catch中的代码块,最后在执行finally中的代码块,与第一种情况相同,catch中需要return的值被放到了栈中,所以finally中对num的改变并不会影响实际返回的值。

小结:

1.finally代码块中内容最后都会被执行,无论是在try中return还是catch中return

2.finally中最好不要进行return操作,最好在try-catch中进行或者函数的末尾进行

3.return的值会被存到临时存储区中去,即使finally代码块中对return值进行修改,也不会影响到最终返回值。

练习题:

练习题一:

public static intmethod_3() {int num = 1;try{

num=1/0;returnnum;

}catch( Exception e) {

System.out.println("catch run...");returnnum;

}finally{++num;

}

}

539732ccc1b51e4d8d7af56a5960f26c.png

练习题二:

public static intmethod_4() {int num = 1;try{returnnum;

}catch(Exception e) {

System.out.println("catch run...");

}finally{++num;

}return 20;

}

15a7343fedcb91e13b4a49a0e6815ebb.png

练习题三:

public static intmethod_5() {int num = 1;try{

num= 1 / 0;returnnum;

}catch(ArithmeticException e) {

System.out.println("catch_1 run ...");return --num;

}catch(Exception e) {

System.out.println("catch_2 run ...");return ++num;

}finally{++num;

}

}

2ef79bd1a9ea947a41d240ef62df02bc.png

这题关键是清楚num=num/0报的是什么错误

练习题五:

public staticArrayList test(){

ArrayList list = new ArrayList<>();try{

list.add("张三");

System.out.println("try block");returnlist;

}catch(Exception e){

list.add("李四");

System.out.println("catch block");returnlist;

}finally{

list.add("王五");

System.out.println("finally block");returnlist;

}

}

运行完后list为["张三","王五"]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值