zoukankan      html  css  js  c++  java
  • 浅谈Java语言中try{}catch{}和finally{}的执行顺序问题

    浅谈Java语言中try{}catch{}和finally{}的执行顺序问题

                                                                                                                                                                                                                                                  2019-04-06  PM  13:41:46 

    1、 不管有没有出现异常,finally块中代码都会执行;

    2、 当try和catch中有return时,finally仍然会执行;

    3、 finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;

    4、 finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。其主要有以下几种情况:

    Case 1:

    package com.MrZ_baby.project;

    public class Test {

      public int add(int x,int y) {

          try {

          }catch(Exception e) {

          }finally {

          }

          return 0;

      }

      public static void main(String argv[]) {

          Test test = new Test();

          System.out.println("x+y="+test.add(43,4));

      }

    }

    输出结果:

    x+y=0

    显然程序是按顺序执行。先执行try次之执行catch最后执行finall,然后返回add函数里的return 0.

    Case 2:

    package com.MrZ_baby.project;

    public class Test {

      public int add(int x,int y) {

          try {

              return x+y;

          }catch(Exception e) {

          }finally {

          }

          return 0;

      }

      public static void main(String argv[]) {

          Test test = new Test();

          System.out.println("x+y="+test.add(43,4));

      }

    }

    输出结果:

    x+y=47

    程序执行try块中return之前(包括return语句中的表达式运算)代码;再执finally块,最后执行try中return;finally块之后的语句return,因为程序在try中已return所以不再执行。

    Case 3 :

    package com.MrZ_baby.project;

    public class Test {

      public int add(int x,int y) {

          try {

          }catch(Exception e) {

              return x+y;

          }finally {

             

          }

          return 0;

      }

      public static void main(String argv[]) {

          Test test = new Test();

          System.out.println("x+y="+test.add(43,4));

      }

    }

    输出结果:

    x+y=0

    程序先执行try,如果遇到异常执行catch块,有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。无异常:执行完try再finally再return.

    Case 4 :

    package com.MrZ_baby.project;

    public class Test {

      public int add(int x,int y) {

          try {

              return x+y;

          }catch(Exception e) {

             

          }finally {

              return x+y;

          }

      }

      public static void main(String argv[]) {

          Test test = new Test();

          System.out.println("x+y="+test.add(43,4));

      }

    }

    输出结果:

    x+y=47

    程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。

    Case 5 :

    package com.MrZ_baby.project;

    public class Test {

      public int add(int x,int y) {

          try {

             

          }catch(Exception e) {

              return x+y;

          }finally {

              return x+y;

          }

      }

      public static void main(String argv[]) {

          Test test = new Test();

          System.out.println("x+y="+test.add(43,4));

      }

    }

    输出结果:

    x+y=47

    程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。

    Case 6 :

    package com.MrZ_baby.project;

    public class Test {

      public int add(int x,int y) {

          try {

              return x+y;

          }catch(Exception e) {

              return x+y;

          }finally {

              return x+y;

          }

      }

      public static void main(String argv[]) {

          Test test = new Test();

          System.out.println("x+y="+test.add(43,4));

      }

    }

    输出结果:

    x+y=47

    程序执行try块中return之前(包括return语句中的表达式运算)代码;有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出。无异常:则再执行finally块,因为finally块中有return所以提前退出。

    最终结论:

    任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器会把finally中的return实现为一个warning。

    非宁静无以致远,非淡泊无以明志。
  • 相关阅读:
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    asp.net session对象的持久化
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    小白也能看懂的约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/MrZhangxd/p/10661533.html
Copyright © 2011-2022 走看看