C++转Java/Android Study中,主要依据为《Java编程思想》,其实经历了C++的学习过程中,体会到,书不必读的多,重要的是真的理解了,知识点。
Overview

finally用来做什么?
在Android源码中,经常有try...catch...finally,try catch好理解,那么finally的作用是什么呢?
在C++中,由于没有垃圾回收机制,并且C++会自动析构函数,因此try...catch可能导致内存不能释放而导致内存泄漏,这个时候finally就很重要了,它能保证无论try中发生了什么,内存总能得到释放。
在Java中,既有垃圾回收机制,也没有析构函数可供调用,为什么需要finally呢?答案是把除内存之外的资源恢复到它们的初始状态,这些资源包括:
- 已经打开的文件
- 已经打开的网络连接
- 连接的硬件状态
- 等等...
For example:(Android 9.0/AccessibilityManager.java)
可以先不用管具体含义啦,可以看到在try中,clear了;finally中又restore了。
[图片上传失败...(image-6638b7-1539925867773)]
什么时候finally不会被执行?
1. 与try中的return/break/continue没有直接关系!
For example:
public class FinallyTest1 {
public static void main(String[] args) {
System.out.println("This is test1");
test1();
System.out.println("\nThis is test2");
System.out.println(test2());
}
public static void test1() {
try {
System.out.println("try block");
return;
}finally {
System.out.println("finally block");
}
}
public static int test2(){
int i = 1;
try {
System.out.println("try block");
i = 1 / 0;
return 1;
}catch (Exception e){
System.out.println("exception block");
return 2;
}finally {
System.out.println("finally block");
}
}
}
Result:

可以看到try或catch中return了,finally语句也会执行,并且会在return之前执行。但是如果finally中有return的话,并且finally语句块执行了,那么 finally块中的return语句会覆盖try块中的return返回。
finally与return的具体关系:
finally语句是在try的return语句执行之后,return返回之前执行。
具体例子请看:- Java finally语句到底是在return之前还是之后执行?
2. 那什么时候finally不会被执行呢?
- try语句没有被执行到,就是说程序可能在try之前就挂掉了
- try中killed或interrupted
- 死机/断电
For example:(在try中程序终止了,那么finally语句块则不会执行)
public class FinallyTest1 {
public static void main(String[] args) {
test1();
}
public static void test1() {
try {
System.out.println("try block");
System.exit(0);
return;
}finally {
System.out.println("finally block");
}
}
}
Result:

参考资料
- 《Thinking in Java》
- 关于 Java 中 finally 语句块的深度辨析
- Java finally语句到底是在return之前还是之后执行?
网友评论