zoukankan      html  css  js  c++  java
  • 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 内语句能够影响引用类型但不会影响基本数据类型。
  • 相关阅读:
    深港DJ好听的歌曲
    电调的相关知识
    CAD画图技巧经验
    第一期周二航拍视频分享 2017/07/10
    网站资料
    如何读懂零件图
    航拍技巧经验总汇
    乐迪AT9
    机器学习、数据挖掘、计算机视觉等领域经典书籍推荐
    Eclipse调试Java程序技巧
  • 原文地址:https://www.cnblogs.com/inbase/p/4560616.html
Copyright © 2011-2022 走看看