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 内语句能够影响引用类型但不会影响基本数据类型。
  • 相关阅读:
    powerview使用小记
    OPENWRT自动检测断线脚本
    openwrt路由在中继模式下掉线检测重启脚本
    OPENWRT断网自动关闭WIFI脚本
    jsp <li>中的多个input怎么换行
    联想笔记本G480怎么安装双系统?
    Java中List集合与Set集合
    JS中onfocus()事件,onblur()事件,onload()事件
    java之Date(日期)、Date格式化、Calendar(日历)
    如何一条SQL语句就能统计出多个表中某数据的数量?
  • 原文地址:https://www.cnblogs.com/inbase/p/4560616.html
Copyright © 2011-2022 走看看