之前也一直没有特别在意,今天正好发现了这个问题
彻底搞清顺序问题,先上代码,最下面是结论
public class TryCatchTest {
public static String testReturn(String str) {
try {
if (str.equals("正常结束")) {
return str; //第一句返回
}
if (str.equals("抛出异常")) {
throw new Exception();
}
return str; //三四句返回
} catch (Exception e) {
// System.out.println("catch");
// throw new NullPointerException();
str="出错了"; //这里要对接下来的返回对象做些处理,确保返回的对象不会影响接下来的程序,保证健壮性。
}
// finally{
// System.out.println("finally");
// return "不管怎样都会返回我";
// }
return str+str; //第二句返回
}
public static void main(String[] args) {
System.out.println(TryCatchTest.testReturn("正常结束")); //返回正常结束
System.out.println("================================");
System.out.println(TryCatchTest.testReturn("抛出异常")); //出错了出错了
System.out.println("================================");
System.out.println(TryCatchTest.testReturn("A")); //A
System.out.println("================================");
System.out.println(TryCatchTest.testReturn("B")); //B
}
}
相信不进 catch 块都没有悬念,主要是在 catch 块,finally 中存在着一先盲点
1 抛出异常后 会直接进入 catch 块后 返回 try-catch 块外的 return 所以要注意 return 的对象是否影响后续程序运行,如果影响,catch 中可做适当处理
2 任何执行 try 或者 catch 中的 return 语句之前,都会先执行 finally 语句,这点大家都知道。
所以如果 finally 中有 return 语句,那么程序就 return 了, finally 中的 return 是一定会被 return 的。
编译器把 finally 中的 return 实现为一个 warning ,也就是说如果 finally 中存在 return 相当于其余 return 失效。
3 由于 2,所以即时 catch 中 throw 了,在 throw 前也会先进行 finally 如果 finally 中 return,则 catch 中异常也无法抛出
4 如果在 catch 中 return,finally 中对 return 对象进行改变:基本数据类型的改变无效,对引用改变有效。(引用传递和值传递的区别)
简单例子 伪代码 int i;try(return i=1;)finally{i=2}; return 结果为 1
如有疏漏之处,欢迎指出
PS:现在的工具也是很智能,catch 写了 if 判断对象是否为空,提示 Dead Code 警告,才发现最开始已经 new 过了
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于