Java中的 try、catch、finally

最近发现,有些东西还是要记录一下的,不记录事情一多就慢慢地忘了,真的是好记性不如烂笔头。

今天记录一下finally的警告“finally block does not complete normally”的原因,以及解决方法。(finally必须出现在try,catch块之后,不能单独出现)。

在解决这个警告之前,我们需要先梳理一下各种情况下try,catch,finally的执行结果。

1.当try,catch中有return,finally中没有return时,无论finally中对返回值如何修改,最后返回的依旧是try,catch中的返回值。

2.当try,cath中没有return,finally中有return时,最后返回的是finally中经过处理的返回值。

3.当try,catch中有return,finally中有return时,try,catch中的return被finally中的return覆盖,最后真正返回的是finally中经过处理的返回值。

我们再看一下警告信息“finally block does not complete normally”,它是因为try,catch中有return,而且finally中也有return,finally中的return会覆盖掉try,catch中的return,可能导致finally块无法正常完成。解决这个异常我们根据情况去掉其中一个return即可,不过最好别在finally中加return,他可能会导致返回的并不是我们在try,catch中要返回的值。

https://www.cnblogs.com/aigongsi/archive/2012/04/19/2457735.html

例子:

package hello;

public class Hello {

    public static void main(String[] args) throws ParseException {
        int ret = testFinally0();//10
        System.out.println(ret);
        ret = testFinally1();//2
        System.out.println(ret);
        try{
            testFinally2();//"算术异常"
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    private static int testFinally0() {
        int i;
        try{
            i=10;
            return i;
        }finally{
            i=20;
        }
        
    }

    private static int testFinally1() {
        try{
            return 1;
        }finally{
            return 2;
        }
    }
    
    private static void testFinally2() {
        try{
            throw new NullPointerException("空指针");
        }finally{
            throw new ArithmeticException("算术异常");
        }
    }

}
View Code

 

posted @ 2020-07-25 17:03  htj10  阅读(224)  评论(0编辑  收藏  举报
TOP