1. 程式人生 > >Java finally關鍵字

Java finally關鍵字

釋放資源 urn 微信公眾號 file 方法 new static 釋放 分析

關於finally語句塊,有如下特點:

1.finally語句塊可以直接和try語句塊聯用。try...finally...

2.try...catch...finally也可以

3.通常在finally語句塊中的代碼是一定會執行的。

看以下例子:

import java.io.*;
public class ExceptionTest08{
public static void main(String[] args){
try{
System.out.println("ABC");
return;
}finally{
System.out.println("Test");
}
}
}

編譯運行後輸出:

ABC
Test

通常來說return一執行,方法結束,也就是說return之後的代碼不會再執行。但是由於後面跟的是finally語句塊,上面講過finally語句塊一定會執行,因此System.out.println("Test");也會執行。

再看看以下例子:

import java.io.*;
public class ExceptionTest08{
public static void main(String[] args)throws FileNotFoundException{
try{
FileInputStream fis=new FileInputStream("c:/ab.txt"); //出現異常
//由於上面代碼出現異常,因此System.out.println("BASIC")不會執行。
System.out.println("BASIC");
}finally{
//在finally語句塊中的代碼一定會執行。
System.out.println("AAA");
}
}
}

編譯運行後輸出:

AAA
Exception in thread "main" java.io.FileNotFoundException: c:\ab.txt (系統找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at ExceptionTest08.main(ExceptionTest08.java:36)

只有一種情況finally語句塊是不會執行的。

import java.io.*;
public class ExceptionTest08{
public static void main(String[] args){
try{
//退出Java虛擬機
System.exit(0);
}finally{
System.out.println("AAA");
}
}
}

以上代碼在try語句塊中退出Java虛擬機,導致finally語句塊中的內容不再執行。也就是說,只要在執行finally語句塊之前退出了JVM,則finally語句塊中的內容不再執行。

咱們再深入了解一下finally語句塊。看以下例子:(在編譯運行之前大家可以先分析一下輸出的結果是什麽)

public class ExceptionTest09{
public static void main(String[] args){
int i=m1();
System.out.println(i);
}
public static int m1(){
int i=10;
try{
return i;
}finally{
i++;
System.out.println("m1的i="+i);
}
}
}

編譯運行後輸出:

m1的i=11
10

來看看以上代碼的執行原理:

public class ExceptionTest09{
public static void main(String[] args){
int i=m1();
System.out.println(i); //10
}
public static int m1(){
int i=10;
try{
int temp=i;
return temp;
}finally{
i++;
System.out.println("m1的i="+i); //11
}
}
}

在主方法中調用m1()方法,首先執行m1()方法中的System.out.println("m1的i="+i),輸出m1的i=11,之後執行主方法中的System.out.println(i); 輸出10.

finally語句塊還有一個作用,finally語句塊是一定會執行的,所以通常在程序中,為了保證某資源一定會釋放,一般在finally語句塊中釋放資源。

import java.io.*;
public class ExceptionTest10{
public static void main(String[] args){
FileInputStream fis=null;
try{
fis=new FileInputStream("ExceptionTest10.java");
}catch(FileNotFoundException e){
e.printStackTrace();
}finally{
//為了保證資源一定會釋放,將釋放資源的代碼塊放在finally語句塊中。
if(fis!=null){
try{
fis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
搜索微信公眾號“程序員考拉”,歡迎關註!

Java finally關鍵字