本贴最后更新于 365 天前,其中的信息可能已经时过境迁

之前也一直没有特别在意,今天正好发现了这个问题
彻底搞清顺序问题,先上代码,最下面是结论

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 过了

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:PipeSoloSymWide 等,欢迎大家加入,贡献开源。

    2832 引用 • 3944 回帖 • 654 关注
感谢    关注    收藏    赞同    反对    举报    分享