经常会遇到,经常会混淆,所以记录一下
主要有3种情况
1.内容中有return,finally中没有return
2.内容中有return,finally中有return
3.内容中有return,finally中没有return,但是会改变返回值的情况,就这个会混淆
下面看代码
场景1:
package com.qhong;
public class Main {
public static void main(String[] args) {
System.out.println(test());
}
private static int test(){
int num = 10;
try{
System.out.println("try");
return num += 80;
}catch(Exception e){
System.out.println("error");
}finally{
if (num > 20){
System.out.println("num>20 : " + num);
}
System.out.println("finally");
}
return num;
}
}
Output:
try
num>20 : 90
finally
90
场景2:
package com.qhong;
public class Main {
public static void main(String[] args) {
System.out.println(test());
}
private static int test(){
int num = 10;
try{
System.out.println("try");
return num += 80;
}catch(Exception e){
System.out.println("error");
}finally{
if (num > 20){
System.out.println("num>20 : " + num);
}
System.out.println("finally");
num = 100;
return num;
}
}
}
Output:
try
num>20 : 90
finally
100
场景3:
package com.qhong;
public class Main {
public static void main(String[] args) {
System.out.println(test());
}
private static int test(){
int num = 10;
try{
System.out.println("try");
return num;
}catch(Exception e){
System.out.println("error");
}finally{
if (num > 20){
System.out.println("num>20 : " + num);
}
System.out.println("finally");
num = 100;
}
return num;
}
}
Output:
try
finally
10
总结:
可以看出,
流程是先运行try内部代码,判断finally中是否有return,
如果有,那么就不执行try中的return,继续执行finally中的代码
如果没有,那么执行finally中代码,再执行try的return。
嗯,最麻烦的就是try中return返回的是一个方法,那么在finally有return的时候,方法里面不涉及返回值的代码可以执行,涉及的就不执行,反正就这么招了,一般不要这么干!
网友评论