finally执行顺序
1.try中有return
try中有return,finally依旧可以执行,且先执行finally语句再return
try {
return 1;
} finally {
System.out.println("finally");
}
2.catch中有return
catch中有return,finally依旧可以执行,且先执行finally语句再return
需要注意的是,return后的语句会先执行,然后再执行finally中的语句
try {
//制造异常
int i = 0 / 0;
return 0;
} catch (Exception e) {
return 1;
} finally {
System.out.println("finally");
}
3.finally中有return
finally中如果有return,就会直接返回,会忽略try/catch中的return
try {
//制造异常
int i = 0 / 0;
return 0;
} catch (Exception e) {
return 1;
} finally {
System.out.println("finally");
return 2;
}
总结:
程序在try/catch中碰到return时,知道自己命不久矣,就会先跳到finally,然后就返回。
finally是否会影响返回值
finally先执行再return,那么究竟finally会不会影响return的返回值呢?
1.finally中修改返回的基本数据类型变量 –> 不影响
//catch中的return结果同样
public static int a() {
int i = 0;
try {
i = 99;
return i;
} finally {
i++;
//i = 3;
}
}
运行结果为 99
2.finally中修改返回的String –> 不影响
//catch中的return结果同样
public static String a() {
String s = "0";
try {
s = "1";
return s;
} finally {
s += "2";
//s = "12";
}
}
运行结果为 1
3.finally中修改返回的引用类型变量 –> 影响
public static StringBuilder a() {
StringBuilder s = new StringBuilder("0");
try {
s.append("123");
return s;
} finally {
s.append("456");
}
}
运行结果为 0123456