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的引用设为null,return前面已经接收到返回值了(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方法调用会出现空指针异常。