案例:
如果try{}里面有一个return语句,那try后的finally{}里的code会不会被执行,什么时候被执行,在return之前还是之后?
public class MainThreadAPP {
public static void main(String[] args) {
int m = m();
System.out.println(m);
}
private static int m() {
try {
return 1;
} finally {
System.out.println("finally");
}
}
}
答:会执行,retrun方法会出栈,出栈之前会先看看有没有finally代码块,有就执行。
升级版
finally{ return ...}中有return呢?
public static void main(String[] args) {
int m = m();
System.out.println(m);
}
private static int m() {
try {
return 1;
} finally {
System.out.println("finally");
return 2;
}
}
答:在finally中的rerun会直接出栈返回;所以输出是2;try里面的return不会执行。
豪华版
try{ return method()}呢?
public static void main(String[] args) {
int m = m();
System.out.println(m);
}
private static int m() {
try {
return n();
} finally {
System.out.println("finally");
}
}
private static int n(){
System.out.println("return method");
return 3;
}
答:return会进入方法,然后到finally在return之前执行;
终极版
基本类型在finally中会被修改吗?
public static void main(String[] args) {
int m = m();
System.out.println(m);//0
}
private static int m() {
int i = 0;
try {
return i;
} finally {
i++;
i++;
System.out.println("finally");
System.out.println("finally_" + i); //finally_2
}
}
答:基本类型不会,return结果缓存。
注意:1、对象类型会;能改变属性,因为缓存的时候内存地址;
public static void main(String[] args) {
A m = m();
System.out.println(m.name);
}
private static A m() {
A a = new A("A");
try {
return a;
} finally {
a.name = "B";
System.out.println("finally");
System.out.println("finally_" + a.name);
}
}
static class A {
String name;
public A(String name) {
this.name = name;
}
}
2、那么对于包装类型呢?
========================Integer包装类型也不会变;========================
public static void main(String[] args) {
Integer m = m();
System.out.println(m);
}
private static Integer m() {
Integer i = 1;
try {
return i;
} finally {
i = 2;
System.out.println("finally");
System.out.println("finally_" + i);
}
}
3、最后,对于String和StringBuilder呢?
答案是
========================String不会变,========================
public static void main(String[] args) {
String m = m();
System.out.println(m);
}
private static String m() {
String a = "abc";
try {
return a;
} finally {
a="cde";
System.out.println("finally");
System.out.println("finally_" + a);
}
}
========================StringBuilder还是会变。========================
public static void main(String[] args) {
StringBuilder m = m();
System.out.println(m);
}
private static StringBuilder m() {
StringBuilder a = new StringBuilder();
a.append(1);
try {
return a;
} finally {
a.append(2);
System.out.println("finally");
System.out.println("finally_" + a);
}
}