Java finally關鍵字

來源:互聯網
上載者:User

標籤:因此   abc   NPU   異常   系統   就是   null   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關鍵字

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.