Java异常处理中finally和return的结合使用
如果try语句块中有使用return,并且try语句块中没有任何异常时,程序首先会执行finally然后再执行return;但是对于基本类型的数据,finally的赋值是不会生效的,但是finally中操作引用类型的属性可以生效
//程序正常执行,返回 20;finally中的赋值无效
public static int m2() {
int i = 10;
try {
i = 20;
return i;
}catch(Exception e){
e.printStackTrace();
}finally {
i = 30;
System.out.println("finally");
}
return i;
}
//程序正常执行,返回对象中的name属性值被修改为“李四”;finally中的赋值生效
public static User m3() {
User u = new User();
try {
u.name = "张三";
return u;
}catch(Exception e) {
e.printStackTrace();
} finally {
u.name = "李四";
}
return u;
}
对于基本类型的数据,finally的赋值是不会生效的;对于引用类型的数据可以生效。这是因为finally的赋值对于栈空间的数据是不会改变的,而对于引用类型的赋值发生在堆空间,没有改变地址位置所以它会生效。