快捷搜索: 王者荣耀 脱发

关于try,finally异常。finally一定会执行吗?

关于try,finally。finally一定会执行吗?

答案肯定不是。

先看一下结论: (1)当出现在try之前就有结果返回,也就是有return时,则不会往下执行。 (2)当try之中出现异常时,会执行catch语句,然后是finally;当try中有return时,会将结果返回给finally,然后看finally中是否还有返回语句,如果有则将finally中的结果返回,finally中没有返回语句则将try中的返回语句返回。

进入正文 以案例来说明:

  1. try之前就结果返回
public class Demo01 {
          
   
    private static int test() {
          
   
        int i = 1;
        if (i == 1) {
          
   
            return i;
        }
        try {
          
   
            System.out.println("执行try");
        } finally {
          
   
            System.out.println("执行finally");
        }
        return 0;
    }

    public static void main(String[] args) {
          
   
        System.out.println("执行main:" + test());
    }
}

结果如下:

解释:因为try之前已经return,所以程序中的方法后边就不执行了。也就是finally也不会执行。

  1. try中有异常
public class Demo02 {
          
   
    private static int test02() {
          
   
        try {
          
   
            System.out.println("执行try");
            return 1 / 0;
        } catch (Exception e) {
          
   
            System.out.println("执行catch");
            return 11;
        } finally {
          
   
            System.out.println("执行finally");
        }
    }

    public static void main(String[] args) {
          
   
        System.out.println("执行main:" + test02());
    }
}

结果如下:

解释:因为try之前没有return,先执行try,try中有异常,执行catch并将结果11返回给主线程,最后执行finally

  1. try中有返回语句
public class Demo03 {
          
   
    private static int test03() {
          
   
        int i = 0;
        try {
          
   
            System.out.println("执行try:" + i);
            return i;
        } finally {
          
   
            ++i;
            System.out.println("执行finally:" + i);
        }
    }

    public static void main(String[] args) {
          
   
        System.out.println("执行main:" + test03());
    }
}

结果如下:

解释:因为try之前没有return,先执行try,try中有返回,将其返回给finally,最后执行finally,此时i为0,++i之后为1,最后返回主线程是try中返回的i,所以主线程中的值是0。

  1. try和finally中都有返回语句
public class Demo04 {
          
   
    private static int test04() {
          
   
        try {
          
   
            System.out.println("执行try");
            return 1;
        } finally {
          
   
            System.out.println("执行finally");
            return 2;
        }
    }

    public static void main(String[] args) {
          
   
        System.out.println("执行main:" + test04());
    }
}

结果如下:

解释:因为try之前没有return,先执行try,try中有返回,将其返回给finally,最后执行finally,finally中有返回语句,则直接将其返回给主线程,所以主线程最终值为2。

  1. try和finally中都有返回语句(对第四点的深入理解)
public class Demo05 {
          
   
    private static int test05() {
          
   
        int i = 1;
        try {
          
   
            System.out.println("执行try:" + i);
            i++;
            return i;
        } finally {
          
   
            ++i;
            System.out.println("执行finally:" + i);
            return i;
        }
    }

    public static void main(String[] args) {
          
   
        System.out.println("执行main:" + test05());
    }
}

结果如下:

解释:在第四点的基础上自己可以解释了,就不啰嗦了


经验分享 程序员 微信小程序 职场和发展