Java 在 finally 里返回会忽略执行中的任意异常

Java 在 finally 里返回会忽略执行中的任意异常。如代码如下:

public class TestFinally {

    public static String callFunction(int i) {
        String ret =  "success";
        boolean success = false;
        try {
            if (i % 2 == 0) {
                throw new RuntimeException();
            }
           success = true;
        }  finally {
            if (!success) {
                ret = "not success";
            }
            return ret;
        }
    }

    public static void main(String[] args) {
        System.out.println(callFunction(0));
        System.out.println(callFunction(1));
    }
}

输出结果如下:

not success
success

当参数为 0 时,会抛出异常,然后进入finally 代码块, finally 中,有 return,会返回 “not success”,不会继续向上层抛出异常。
如果我们的上层代码依赖异常,则会返回错误的结果。

向上抛出异常示例

我们把return 放到 finally 代码块之后,代码如下:

import xxx;

public class TestFinally {

    public static String callFunction(int i) {
        String ret =  "success";
        boolean success = false;
        try {
            if (i % 2 == 0) {
                throw new RuntimeException();
            }
           success = true;
        }  finally {
            if (!success) {
                ret = "not success";
            }
        }
        return ret;
    }

    public static void main(String[] args) {
        System.out.println(callFunction(0));
        System.out.println(callFunction(1));
    }
}

执行结果如下:

Exception in thread "main" java.lang.RuntimeException
	at com.baidu.java.finallyTest.TestFinally.callFunction(TestFinally.java:10)
	at com.baidu.java.finallyTest.TestFinally.main(TestFinally.java:22)

当参数为 0 时,会抛出异常,然后执行 finally,在 finally 里没有 return。执行完 finally 代码块后,继续向上层抛出异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值