1.finally不一定执行
1.当 执行程序还未到达try块就已经return。
2.在 try里面执行了System.exit(0) 直接退出JVM。
2.finally 有返回值,一定是返回finally里面return的值。
如下:不管是否有异常,一定是返回3
try{
statement 1;
return 1;
}catch{
statement 2;
return 2;
}finally{
statement 3;
return 3;
}
3.finally 没有返回值
3.1 方法本身没有返回值
- 没有异常,按照顺序执行 statement 1;statement 3;
- 有异常,按照顺序执行 statement 1;statement 2;statement 3;
try{
statement 1;
}catch{
statement 2;
}finally{
statement 3;
}
2.3 方法本身有返回值
- 没有异常,按照顺序执行 statement 1 return x;statement 3 ; 返回x;不管 statement 3是否改变了x的值。
- 有异常,按照顺序执行 statement 1;statement 2 return y;statement 3; 返回 y ;不管 statement 3是否改变了y的值。
try{
statement 1;
return x; //这里会把返回值保存到一个临时栈里面,当finally执行完后,将这个值返回
}catch{
statement 2;
return y; //这里会把返回值保存到一个临时栈里面,当finally执行完后,将这个值返回
}finally{
statement 3; //不能改变临时栈里面的值
}
注 意 \color{red}{注意} 注意:如果返回的是对象引用,那么finally还是能改变对象里面的属性值。
调用:testTryCatchFinally() 返回aa.getName() 为 yy
private static A testTryCatchFinally() {
A aa = new A();
try {
aa.setName("xx");
return aa; //#1 将返回值保存到一个临时栈(引用地址)
} catch (Exception e) {
System.out.println("抛出异常:"+e.getMessage());
return aa;
} finally {
System.out.println("执行了finally"); //#2 执行finally语句
aa.setName("yy"); //# 执行完之后,return 告诉程序已经执行完,并且修改了对象的值
}
}
static class A {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```