zoukankan      html  css  js  c++  java
  • try、catch、finally带return的执行顺序总结

    如果try中没有异常,则顺序为try→finally,如果try中有异常,则顺序为try→catch→finally,但是当try、catch、finally中加入return之后,就会有几种不同的情况出现:

    一:try中带有return

      1、基本类型的情况下:

      

     1 public static void main(String[] args) {
     2         int i = testCep1();
     3         System.out.println(i);
     4     }
     5 
     6     private static int testCep1() {
     7         int i = 1;
     8         try {
     9              i++;
    10              System.out.println("try:" + i);
    11              return i;
    12          } catch (Exception e) {
    13              i++;
    14              System.out.println("catch:" + i);
    15          } finally {
    16              i++;
    17              System.out.println("finally:" + i);
    18          }
    19          return i;
    20      }

    输出:

      

       当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息,因此:try中计算后的2,而非finally中计算后的3

      2、引用类型的情况下:

      

    public static void main(String[] args) {
            List<Integer> list = testCep2();
            System.out.println(list);
        }
    
        private static List<Integer> testCep2() {
            List<Integer> list = new ArrayList<>();
            try {
                list.add(1);
                System.out.println("try:" + list);
                return list;
            } catch (Exception e) {
                list.add(2);
                System.out.println("catch:" + list);
            } finally {
                list.add(3);
                System.out.println("finally:" + list);
            }
            return list;
        }

    输出:

      

       引用类型保存的是变量的地址,所以变量的值在finally中发生改变后,会改变

    二:catch中带有return

     1 public static void main(String[] args) {
     2         int i = testCep3();
     3         System.out.println(i);
     4     }
     5 
     6     private static int testCep3() {
     7         int i = 1;
     8         try {
     9             i++;
    10             System.out.println("try:" + i);
    11             int x = i / 0 ;
    12         } catch (Exception e) {
    13             i++;
    14             System.out.println("catch:" + i);
    15             return i;
    16         } finally {
    17             i++;
    18             System.out.println("finally:" + i);
    19         }
    20         return i;
    21     }

    输出:

      

      catch中return值会覆盖try中的retrun值, finally中涉及到变量如果是基本类型不影响,如果是引用类型会影响

    三:finally中带有return

    public static void main(String[] args) {
            int i = testCep4();
            System.out.println(i);
        }
    
        private static int testCep4() {
            int i = 1;
            try {
                i++;
                System.out.println("try:" + i);
                int x = i / 0 ;
                return i;
            } catch (Exception e) {
                i++;
                System.out.println("catch:" + i);
                return i;
            } finally {
                i++;
                System.out.println("finally:" + i);
                return i;
            }
        }

    输出:

      

     当finally中有return的时候,try中和catch中的return会失效,在执行完finally的return之后,就不会再执行try中的return,一旦finally里出现异常,会导致catch中的异常被覆盖

  • 相关阅读:
    Ubuntu 只能用guest登录的问题修复
    Ubuntu下编译C语言程序(同时给编译生成的文件命名)
    设置PYTHONIOENCODING
    Ubuntu安装atom
    R语言中将数据框(data.frame)中字符型数据转化为数值型
    修改记事本默认编码为UTF-8
    Java虚拟机浅探
    制作宅基腐主页 && 制作个人简历--材料:BootStrap
    尝试用有限状态机解决一道算法题
    OOP,WEB开发实用小技巧
  • 原文地址:https://www.cnblogs.com/xl118/p/13203544.html
Copyright © 2011-2022 走看看