zoukankan      html  css  js  c++  java
  • try-catch-finally容易犯的错误

    测试环境 JDK1.8

    1. catch中包含return

    //有return的时候 输出13423
    //无return的时候 输出134234
    public class Trycatch {
        
        public static String output = "";
        public static void main(String[] args) {
            foo(0);
            foo(1);
            System.out.println(output);
        }
    
        private static void foo(int i) {
            try {
                if(i==1){
                    throw new Exception();
                }
                output += "1";
            } catch (Exception e) {
                output += "2";
                //return;
            }finally{
                output += "3";
            }
            
            output += "4";
        }    
    }

    2. try中有return,finally里无return

    public class Trycatch2 {
    
        public static void main(String[] args) {
            int k = test();
            System.out.println(k);
        }
    
        public static int test() {
            int a = 0;
            try {
                a = 1;
                return a;
            } finally {
                System.out.println("It is in final chunk");
                a = 2;
                //return a;
            }
        }
    
    }
    
    //输出结果
    It is in final chunk
    1

    3. try中有return,finally里也有return

    public class Trycatch2 {
    
        public static void main(String[] args) {
            int k = test();
            System.out.println(k);
        }
    
        public static int test() {
            int a = 0;
            try {
                a = 1;
                return a;
            } finally {
                System.out.println("It is in final chunk");
                a = 2;
                return a;
            }
        }
    
    }
    
    //输出结果
    It is in final chunk
    2

    2和3的解析

    解析2

    当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 
    在执行`a = 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,
    这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。

    解析3

    finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.
  • 相关阅读:
    BZOJ2456
    BZOJ2648
    POJ1639
    LOJ6003
    LOJ6002
    LOJ6001
    LOJ116
    POJ2594
    BZOJ4554
    JS事件 加载事件(onload)注意:1. 加载页面时,触发onload事件,事件写在<body>标签内。 2. 此节的加载页面,可理解为打开一个新页面时。
  • 原文地址:https://www.cnblogs.com/qingdaofu/p/7488219.html
Copyright © 2011-2022 走看看