美文网首页
Java中try-catch代码块的问题

Java中try-catch代码块的问题

作者: 朴勋l | 来源:发表于2017-03-30 09:13 被阅读53次

    最近遇到一道关于java中try-catch代码块执行顺序的问题。
    话不多说,先上一段代码:

    public class Main_1 {
        public static void main(String[] args) {
            
            System.out.println(test());
        }
        public static int test(){
            int a = 0;
            try{
                a=1;
                return a;
            }catch(Exception e){
                
            }finally{
                a=2;
            }
        }
    }
    
    
    输出结果.jpg

    从结果上看,貌似finally 里的语句是在return之后执行的,其实不然,实际上finally 里的语句是在在return之前执行的。那么问题来了,既然是在之前执行,那为什么a 的值没有被覆盖了?
    实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行a = 2时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。
    我们再看下面一段代码:

    public class Main_1 {
        public static void main(String[] args) {
            
            System.out.println(test());
        }
        public static int test(){
            int a = 0;
            try{
                a=1;
                return a;
            }catch(Exception e){
                
            }finally{
                a=2;
                return a;
            }
        }
    }
    
    
    输出结果.jpg

    在这里,finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.

    那么我们大体上可以总结如下:
    1.finally{}代码块比return先执行、
    2.有多个return时是按顺序执行的,但只要执行了一个,后面的return就都不会执行了

    相关文章

      网友评论

          本文标题:Java中try-catch代码块的问题

          本文链接:https://www.haomeiwen.com/subject/avduottx.html