Java-finally关键字

Java-finally关键字

1. finally和return的执行顺序

一句话总结:当 try - catch 中使用 breakreturn 返回时,finally 会执行,当调用了 System.exit(0) 退出时,由于直接终止了 JVM,因此 finally 不会执行。

在 try - catch 中的 return 语句执行之后、方法返回之前,程序会将 return 的返回值写入内存中,然后等待 finally 语句执行完,如果在 finally 代码块中,只改变了引用(例如对变量重新赋值),由于 return 时已经将返回值写入了内存中,则不会改变,而如果是改变了同一个变量的值,则会改变。如果 finally 中包含 return 语句,则会覆盖原本的return。例如:

1
2
3
4
5
6
7
8
9
10
11
public int getValue() {
int i = 10;
try {
return i;
}
finally {
i = 20;
}
}

System.out.println(getValue());

输出 10。

1
2
3
4
5
6
7
8
9
10
11
12
public int getValue() {
int i = 10;
try {
return i;
}
finally {
i = 20;
return i;
}
}

System.out.println(getValue());

输出 20。

1
2
3
4
5
6
7
8
9
10
11
public StringBuilder getValue() {
StringBuilder sb = new StringBuilder("AAA");
try {
return sb.append("BBB");
}
finally {
sb.append("CCC");
}
}

System.out.println(getValue());

输出 "AAABBBCCC"。