• try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?


    一, 

    package demo;
    
    public class tryDemo {
        private static int see(){
            int s = 0;
            try{
                s +=2;
                System.out.println("执行完try");
                return s;
            }catch(Exception e){
                return s+1;
            }finally{
                System.out.println("执行完finally");
                
            }
        }
        public static void main(String[] args) {
            int a = see();
            System.out.println("a : "+ a );
        }
    }

    运行结果:

    执行完try
    执行完finally
    a : 2

    说明,如果 try当中有return 的话, 先执行完return中的语句,在执行finally中的语句,最后 返回 try 中的 return。

    二,如果 finally当中也有 return呢 ?

    package demo;
    
    public class tryDemo {
        private static int see(){
            int s = 0;
            try{
                s +=2;
                System.out.println("执行完try");
                return s;
            }catch(Exception e){
                return s+1;
            }finally{
                System.out.println("执行完finally");
                return s+3;
                
            }
        }
        public static void main(String[] args) {
            int a = see();
            System.out.println("a : "+ a );
        }
    }

    输出结果:

    执行完try
    执行完finally
    a : 5

    说明: 这种情况下,不执行 try当中的 return ,最后返回的是 finally 中的值 。

    三 ,

    如果 try当中有 return s,

    finally没有 return, 但在 finally 中 有 对 s 的操作,那么 try 当中的 return  s 是 更改后的 s 吗?

    package demo;
    
    public class tryDemo {
        private static int see(){
            int s = 0;
            try{
                s +=2;
                System.out.println("执行完try");
                return s;
            }catch(Exception e){
                return s+1;
            }finally{
                System.out.println("执行完finally");
                s +=1;
                //s=5;
                
            }
        }
        public static void main(String[] args) {
            int a = see();
            System.out.println("a : "+ a );
        }
    }

    输出结果:

    执行完try
    执行完finally
    a : 2

    说明, finally当中的 对 s 的修改 并不对 try当中的 return 值产生影响。

    四,针对 int类型 和 List 类型的一个小区别

    1,针对 int 类型

    package tuling;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ErrorAndThr0 {
            public static void main(String[] args) {
                int a = test();
                System.out.println("a = "+ a);
            }
            
            private static int test(){
    
                int i = 0;
                try{
                    i++;
                    System.out.println("try block,i = " + i);
                    return i;
                }catch(Exception e){
                    i++;
                    System.out.println("catch block , i = "+ i );
                    return i;
                }finally{
                    i++;
                    System.out.println("finally block, i = "+ i);
                }
            
            }
    
        
    
    
    }

    输出结果:

    try block,i = 1
    finally block, i = 2
    a = 1

    我们看下.class文件反编译的源代码:

     当然 ,红色 的部分 还未得到证实, 我是看  03-Exception和Error的区别-杨过 的 第 16分钟 是这么说的 。 

    2, 针对 List 类型

    package tuling;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ErrorAndThr {
        public static void main(String[] args) {
            List <String> list = test();
            System.out.println("list : "+ list.toString());
        }
        
        private static List test(){
    
            List <String> list = new ArrayList<String>();
            try{
                list.add("step try");
                System.out.println("try block");
                return list;
            }catch(Exception e){
                list.add("step catch");
                System.out.println("catch block");
                return list;
            }finally{
                list.add("step finally");
                System.out.println("finally block");
            }
        
        }
    
    }

    输出结果:

    try block
    finally block
    list : [step try, step finally]

    我们看下.class文件反编译的源代码:

     说明,针对 list类型,finally类型的操作会影响 try 当中return的结果。

  • 相关阅读:
    Node.js github开源代码
    Node.js Base64 Encoding和Decoding
    图论500题
    gvim中的gvimrc和vimrc
    ubuntu 命令行卸载并清理软件
    vim复制到系统剪贴板
    Electron 主进程与渲染进程之间的通 信(同步通信、异步通信)
    Android 使用系统录制视频功能
    Electron 自定义软件顶部菜单、右键菜单以及绑定快捷键
    Electron remote 模块、通过 BrowserWindow 打开新窗口
  • 原文地址:https://www.cnblogs.com/william-dai/p/13322071.html
Copyright © 2020-2023  润新知