项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步
1.try-catch中的返回值
java代码中,有各种各样的try-catch代码用来捕获各种异常。那么在try-catch代码中,返回值是如何处理的呢?先看看下面的代码
public static int test_finally() {
int x;
try {
x = 1;
//int y = 1/0; 注释1
//String raw = "a"; 注释2
//raw.substring(3); 注释2
return x;
} catch(ArithmeticException ex) {
x = 2;
return x;
} finally {
x = 3;
}
}
2.执行结果
1.如果代码正常执行,返回结果为1。 2.如果加入注释1的代码,返回结果为2。 3.如果加入注释2的代码,直接抛出异常无返回结果。
3.结果分析
第一种情况很好理解,代码走正常逻辑直接返回结果。 第三种情况也比较好理解,直接抛异常。 第二种情况有的同学可能会问,明明finally中给x=3,为什么会返回2?
对于一个java方法来说,退出的方式有两种:
遇到一个返回的指令(return语句)遇到一个异常,并且没有搜索到异常处理器,不会给调用返回任何值。 所以当catch中有return时,程序遇到return时就被标记了,finally块中只是执行最后的清理工作,如数据库连接的释放等。但是并不会修改return这个语句。 如果我们把代码放在intellij里面,x = 3这一行会提示: The value 3 assigned to 'x' is never used less
如果我们在intellij里面debug,当代码运行到x = 3这一行时,堆栈信息如下:
当程序执行到catch代码快中的return x 那一行时,首先是将x的一个副本保存在了方法栈帧的本地变量表中,执行return之前必须执行finally中的操作:x=3,此时将x设置为了3。但是return时是将本地变量表中保存的x的那个副本拿出来放到栈顶返回,所以出ArithmeticException异常或其子类异常时,返回值是2。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。