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 内语句能够影响引用类型但不会影响基本数据类型。
  • 相关阅读:
    Java的三个基础排序算法(其余将在以后补充)
    Review PHP设计模式之——单例模式
    Mysql忘记密码,重新设置
    PHP加解密相关函数
    http返回状态代码及含义
    符合web标准的网页下拉菜单
    解决MySQL查询不区分大小写
    MYSQL Error 2006HY000:MySQL server has gone away的解决方案
    MySQL之count(*)与count(id)效率比较(转)
    如何让sudo命令不需要输入密码就可执行
  • 原文地址:https://www.cnblogs.com/inbase/p/4560616.html
Copyright © 2011-2022 走看看