Java Study- finally

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011391629/article/details/83176508

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了。
在这里插入图片描述

什么时候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:

在这里插入图片描述

参考资料

猜你喜欢

转载自blog.csdn.net/u011391629/article/details/83176508