Java中finally和return的执行顺序


finally 语句

概念:
和try-catch语句一起出现,也可以和循环语句一起出现。

作用:
一般用来释放资源,并确保某些操作一定会执行,即使try-catch中的代码抛出了异常。


finally 和 return 语句的执行顺序

finally语句一定会被执行。

  • 如果return在finally语句之前,会先执行return语句(未返回结果),再执行finally语句,执行完后返回结果。
    eg.
public class Test_finally {
  public static Map<String,String> getMap(){
      HashMap<String, String> map = new HashMap<>();
      map.put("key","value");
      try {
          map.put("key","try");
          return map;
      }catch (Exception e){
          map.put("key","catch");
      }finally {
          map.put("key","finally");
          map=null;
      }
      return map;
  }

  public static void main(String[] args) {
      String value = getMap().get("key");
      System.out.println(value);
  }
}

输出结果:

finally

疑问: 为什么程序不报空指针异常而是输出 finally ?

解读:

1.对 return 的理解
第一:return后面的语句不会被执行,除非是finally中的语句。

getMap()方法里有2个return,但只会按顺序执行第一个。

第二:return 默认不会存储任何值,它用来返回函数中的值。如果函数中没有返回值,那它将返回null。

try代码块中执行 return map; 语句后,此时return接收到的返回值为:(key,try)键值对。之后执行finally语句。

2.对 null 的理解
第一:null是一种特殊的值,它不属于任何数据类型,它可以被赋值给任何引用数据类型,但是不能被赋值给基本数据类型。
第二:null 不会作为值传递 。

finally {
    map.put("key","finally");
    map=null;
}

map.put(“key”,“finally”); 语句把map指向的空间值修改为(key,finally)
map=null; 语句是把map的引用设为nullreturn前面已经接收到返回值了(map引用所指向空间的值),只是没有将结果返回。不会改变 return 所指向的空间值(key,finally)。null不会作为值传递,return有返回值所以不会返回null。

Java中没有传址概念,只有传值概念


  • 如果return在finally语句之后,按顺序执行完finally语句再执行return语句。
    eg.(把上面例子第一个return去掉)
public class Test_finally {
    public static Map<String,String> getMap(){
        HashMap<String, String> map = new HashMap<>();
        map.put("key","value");
        try {
            map.put("key","try");
        }catch (Exception e){
            map.put("key","catch");
        }finally {
            map.put("key","finally");
            map=null;
        }
        return map;
    }

    public static void main(String[] args) {
        String value = getMap().get("key");
        System.out.println(value);
    }
}

结果: 程序运行报空指针异常

解读:

由于null不会作为值传递,return没有收到任何返回值,默认返回null,所以main方法调用会出现空指针异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值