Java Study-finally

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


Overview

Java Study-finally_第1张图片
image.png

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:


Java Study-finally_第2张图片
image.png

可以看到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:

image.png

参考资料

  • 《Thinking in Java》
  • 关于 Java 中 finally 语句块的深度辨析
  • Java finally语句到底是在return之前还是之后执行?

你可能感兴趣的:(Java Study-finally)