情况1: finally没有return
public static int show() {
try {
return 1;
}finally{
System.out.println("finally");
}
}
结果:
finally
1
情况2: finally没有return, 但有 基本类型的 变量修改
public static int show() {
int i = 1;
try {
return i;
}finally{
System.out.println("finally");
i = i + 2;// 此处对 i进行修改无效
}
}
结果:
finally
1
情况3: finally有return
public static int show() {
int i = 1;
try {
i= i + 1;
return i;
}finally{
System.out.println("finally");
return i + 2;// 此处return, 生效
}
}
结果:
finally
4
情况4: 出现异常时
public static int show() {
int i = 1;
try {
i = i / 0;// 制造异常
return i;
}catch(Exception e){
System.out.println("catch");
i = i + 1;
return i;
}finally{
System.out.println("finally");
i = i + 2;
return i;// 此处return, 生效
}
}
结果:
catch
finally
4
基本数据类型: 值的改变 取决于 finally处有没有 return
有: 则使用finally处的return
无:则使用正常语句的return, finally处的代码一定会被执行, 对基本类型的变量修改无效 (对引用类型是有效的, 原因可自行百度)
异常处理:
1.异常catch部分同正常流程类似, 只是增加catch部分的逻辑处理,
2.throw 抛出异常 和 return 类似
总结:
1.finally处的return, 覆盖try和catch里的return;
2.注意引用类型传递的坑
====================================
个人的记忆方式:
把finally部分的代码 当成1个方法
public static int demo() {
int i = 1;
try {
...正常逻辑...
if( finally部分里有 return ){
return finally(); // 直接返回 finally 中的结果
}else{
finally(); // 执行finally部分逻辑
return i; // 再return
}
}
}