zoukankan      html  css  js  c++  java
  • Java_try,catch,finally return之间的执行顺序

    以往认为函数只要执行到return语句便会返回结果并终止,然而这时错误的,因为这存在特例。

    掌握下面几条原则就可以完全解决“当try、catch、finally遭遇return”的问题。

    原则:1、finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行。

               2、 函数执行完try块中的return语句后不会终止,还会继续执行catch(仅在抛出异常时执行)、finally语句块。

               3、函数必须确保有唯一返回值

    说明: try中如果包含return语句则catch块和finally块中必须至少有一个含有return语句。或者try中通过throw new Exception();抛出异常,则catch与finally中至少有一个return语句。因为try块会假定其中发生异常,且try块中的代码要么顺利执行,要么抛出异常。如果只在try块中包含return语句不能保证函数有返回值(如try抛出时,return语句不会执行)。所以为了保证函数具有返回值,java强制要求原则。

               4、return语句的优先级是finally最大,且try与catch块中只有两者之一的return语句会被执行。为保证函数只有一个返回值则返回优先级最大的值。

    下面通过例子讲解上面的三条原则

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class TestReturn {
        public static void main(String[] args) {
            TestReturn t1 = new TestReturn();
            int k = 0;
            System.out.println(t1.test1(k));
        }
                  
              
        public int test1 (int k) {
                      
            try {
                k = k + 1;
                System.out.println("try"+ k);
                return k;
            } catch (Exception e) {
                k = k + 2;
                System.out.println("catch"+ k);
                return k;
            } finally {
                k = k + 3;
                System.out.println("finally"+ k);
                return k;
            }
        }
    }

    结果:

    try1

    finally4

    4

    说明:try中执行完输出后,由于其return优先级并不最高,所以不会返回,继续执行finally语句块并返回

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class TestReturn {
              
        public static void main(String[] args) {
            TestReturn t1 = new TestReturn();
            int k = 0;
            System.out.println(t1.test1(k));
        }
              
          
        public int test1 (int k) {
            try {
                throw new Exception();
            } catch (Exception e) {
                k = k + 2;
                System.out.println("catch"+ k);
                return k;
            } finally {
                k = k + 3;
                System.out.println("finally"+ k);
                return k;
            }
        }
    }

    结果:

    catch2

    finally5

    5

  • 相关阅读:
    关于gc日志中Desired Survivor的疑问和对象晋升老年代的小结
    Tomcat 中部署 web 应用 ---- Dubbo 服务消费者 Web 应用 war 包的部署
    10种常见的排序算法
    让我们来谈谈JDBC
    单例的设计模式
    使用putty与SSHSecureShellClient登录远程服务器完成与本地Git项目的同步
    安装 Dubbo 管理控制台
    邮件工具类
    Hadoop系列教程<一>---Hadoop是什么呢?
    setTimeout闭包常见问题
  • 原文地址:https://www.cnblogs.com/changkai244/p/4108768.html
Copyright © 2011-2022 走看看