//一个方法可否执行两次return,如果两次return都返回了一个值那么返回哪个值?
public class Solution {
public static void main(String[] args) {
System.out.println(fun());
}
public static int fun() {
try {
System.out.println("执行一次return");
return 1;
} catch (Exception e) {
System.out.println("抛出异常");
} finally {
System.out.println("执行第二次return");
return 2;
}
}
}
在上面的代码中执行了两次return,第一次return是在try语句中执行,但是并没有直接返回而是把需要return的值保存了下来然后执行finally语句,在finally语句中又执行了第二次return,这次直接将值返回了所以返回的是第二次执行的值。
这里涉及了try,catch,和finally的执行顺序问题。
首先执行try语句中的代码,如果执行到某一行出现异常则停止执行直接转到catch语句执行,最后不管是否抛出异常都会执行finally语句中的代码。
下面的代码输出什么?
public class Solution {
public static void main(String[] args) {
System.out.println(fun());
}
public static int fun() {
int i = 1;
try {
System.out.println("执行return");
return i++;
} catch (Exception e) {
System.out.println("抛出异常");
} finally {
i++;
}
return i;
}
}
在前面提到了try语句中的return是把要return的值保存,而不是保存变量。所以执行finally后仍然返回1。
在这里说一下不执行finally代码块的三种情况。
1、程序没有进入try代码块。
2、进入try代码块但是其中出现了死锁或者死循环。
3、进入try代码块但是其中执行了System.exit()方法。
finally代码块的职责不在于对变量进行赋值等操作,而是清理资源、释放连接、关闭管道流等操作。
相对在finally代码块中赋值,更加危险的做法是在finally块中使用return操作,这样的代码会使返回值变得非常不可控。