• JAVA小知识点-Finally和Return的执行关系


    如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题:

    public static Map<String, String> getMapTry() {
            Map<String, String> map = new HashMap<String, String>();
            map.put("KEY", "INIT");
             
            try {
                map.put("KEY", "TRY");
                return map;
            }
            catch (Exception e) {
                map.put("KEY", "CATCH");
                e.printStackTrace();
            }
            finally {
                map.put("KEY", "FINALLY");
            }
             
            System.out.println("---------end--------");
            return map;
        }
        
    public static Map<String, String> getMapCatch() {
            Map<String, String> map = null;
             
            try {
                map.put("KEY", "TRY");
            }
            catch (Exception e) {
                map = new HashMap<>();
                map.put("KEY", "CATCH");
                e.printStackTrace();
                return map;
            }
            finally {
                map.put("KEY", "FINALLY");
            }
            System.out.println("---------end--------");
            return map;
    }
        
        
    public static int getInt() {
            Map<String, String> map = null;
            int ret =0; 
            try {
                map.put("KEY", "TRY");
                ret = 1;
            }
            catch (Exception e) {
                map = new HashMap<>();
                map.put("KEY", "CATCH");
                e.printStackTrace();
                return ret;
            }
            finally {
                map.put("KEY", "FINALLY");
                ret =3;
            }
            System.out.println("---------end--------");
            return ret;
        }
        
        public static void main(String[] args) {
            System.out.println("try:" + getMapTry().get("KEY").toString());
            System.out.println("catch:" + getMapCatch().get("KEY").toString());
            System.out.println("int:" + getInt());
            
    }

    执行结果:

    try:FINALLY
    java.lang.NullPointerException
      at com.wmshua.test.FinallyReturnRelation.getMapCatch(FinallyReturnRelation.java:43)
      at com.wmshua.test.FinallyReturnRelation.main(FinallyReturnRelation.java:14)
    catch:FINALLY
    java.lang.NullPointerException
      at com.wmshua.test.FinallyReturnRelation.getInt(FinallyReturnRelation.java:63)
      at com.wmshua.test.FinallyReturnRelation.main(FinallyReturnRelation.java:15)
    int:0

    结果分析:

    引用类型发生了变化,基本数据类型没有修改。

    从执行结果得出以下结论:

    1. finally 即使在try或者catch中存在 return 且执行的情况下也会执行。
    2. finally 对变量的修改发生在方法调用结束之前。
    3. return 语句是在 finally 之前执行的。
    4. return 的返回结果并不是返回原数据而是对原有数据的拷贝,基本数据类型拷贝基本类型值,引用类型拷贝引用而不拷贝引用内的值。
    5. finally 内语句能够影响引用类型但不会影响基本数据类型。
  • 相关阅读:
    Servlet 生命周期、工作原理(转)
    JVM的内存区域划分(转)
    Java的四个基本特性和对多态的理解
    单例模式和多例模式的区别(转)
    TCP/IP协议体系结构简介
    数据库优化性能
    存储过程的优缺点(转)
    ConurrentHashMap和Hashtable的区别
    XML和JSON优缺点
    HashMap和HashTable的区别
  • 原文地址:https://www.cnblogs.com/inbase/p/4560616.html
Copyright © 2020-2023  润新知