初学java的时候 大家应该还记得有一句话:最终都会执行finally; 那么时间久了 真正的执行顺序,真的还记得吗?
首先看看csdn中某一篇点击量 赞评都很高的文章,如下图 是否发现问题?
同时也反应一个问题 这些基础带细节性的东西,真的很容易被忽略
=分割线1==================================
先看看return不带值的情况
例子1:
public class Demo {
public static void main(String[] args) {
int a = 0;
try {
a = 3 ;
System.out.println(a);
return;
} catch (Exception e) {
System.out.println("e");
} finally {
a = 1;
System.out.println(a);
}
}
}
输出结果:3 1
如果使用debug模式可以发现(图略):会先进入try模块中,将a赋值3 到sout(a)的时候 忽略try模块中的return,直接进入finally,再将a赋值1 ,最后执行try模块的return。由此可见 finally是比try的return先行执行的
例子2
public class Demo {
public static void main(String[] args) {
int a = 0;
try {
a = 3 ;
System.out.println(a);
return;
} catch (Exception e) {
System.out.println("e");
} finally {
a = 1;
System.out.println(a);
return;
}
}
}
与例子1不同的地方在于finally模块中加了一个return,输出结果是一样的,唯一不同点在于finally打印a后,执行finally的return,不再执行try模块的return;
例子3
public class FinallyAndReturn {
public static void main(String[] args) {
int a = 0;
try {
a = 3/0;
return;
}catch (Exception e){
System.out.println("e");
return;
}
finally {
a = 1;
System.out.println(a);
return;
}
}
}
输出结果为:e 1 执行顺序:先进入try模块 执行到 a=3/0时进入catch模块,输出"e",忽略catch中的return,进入finally,输出a,执行return;
结论:return不带值的时候,无论是try还是catch中的return,都比finally后执行,且finally中有return,不再执行try catch中的return,(java只有一个返回值)
分割线2=======================
再看看return带返回值
public class tryDemo {
public static int getReturn() {
int result = 0;
try {
int xx = result;
return xx;
}finally{
result = 1;
System.out.println(result);
return result;
}
}
public static void main(String args[]) {
System.out.println(getReturn());
}
}
执行结果为 1 1 (finally输出一次,main方法输出一次)
return带值时执行顺序:进入try模块,并执行return ,再进入finally模块,再执行一遍finally的return,由此可以补充一点:java最终只有一个返回值,但是过程中可能return了两次
那么,回到最开始的截图,发现哪儿出错了吗?