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

  • 相关阅读:
    病毒木马查杀实战第017篇:U盘病毒之专杀工具的编写
    病毒木马查杀实战第016篇:U盘病毒之逆向分析
    病毒木马查杀实战第015篇:U盘病毒之脱壳研究
    病毒木马查杀实战第014篇:U盘病毒之手动查杀
    病毒木马查杀实战第024篇:MBR病毒之编程解析引导区
    病毒木马查杀实战第023篇:MBR病毒之引导区的解析
    缓冲区溢出分析第11课:整数溢出的原理
    缓冲区溢出分析第10课:Winamp缓冲区溢出研究
    Backdoor.Zegost木马病毒分析(一)
    缓冲区溢出分析第09课:MS06-040漏洞研究——深入挖掘
  • 原文地址:https://www.cnblogs.com/changkai244/p/4108768.html
Copyright © 2011-2022 走看看