最近发现某些网友在刷题,然后有这么一个题,在java中当try和finally同时有return时,返回值应该是哪个?一看就是闲的蛋疼,正常人谁会这么写呢?不过还是打算从字节码层面做一个解释吧。代码如下:
public String testReturn(){
try {
retrun "try";
}catch (Exception e){
e.printStackTrace();
}finally{
return "finally";
}
}
这是实际测试时用的代码:
从执行结果中可以看到,返回的是finally。当然,这只是其中一种情况,其余的我也懒得验证了,列举出来诸君自行验证:
1.当返回的是同一个变量时,又或者该变量在某个位置进行了变更。
public String testReturn(){
String string = "hello";
try {
retrun string;
}catch (Exception e){
e.printStackTrace();
}finally{
return string;
}
}
2.当返回前抛出了异常
public String testReturn(){
try {
//抛出了异常时
retrun "try";
}catch (Exception e){
e.printStackTrace();
}finally{
return "finally";
}
}
不过我觉得这俩好像就更没意思了。接下来我们看看字节码的情况:
从代码中我们看到:
第0行:将常量池中#42的字符串try给放入操作数栈中;
第3行:在将常量池中#44的字符串finally放入操作数栈中;
通过栈先进后出的原理,那么会先返回finally,另外,方法只会有一个返回值,所以是finally。