程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用finally做什麼

用finally做什麼

編輯:關於JAVA

在沒有“垃圾收集”以及“自動調用破壞器”機制的一種語言中(注釋⑤),finally顯得特別重要,因為程序員可用它擔保內存的正確釋放——無論在try塊內部發生了什麼狀況。但Java提供了垃圾收集機制,所以內存的釋放幾乎絕對不會成為問題。另外,它也沒有構建器可供調用。既然如此,Java裡何時才會用到finally呢?

⑤:“破壞器”(Destructor)是“構建器”(Constructor)的反義詞。它代表一個特殊的函數,一旦某個對象失去用處,通常就會調用它。我們肯定知道在哪裡以及何時調用破壞器。C++提供了自動的破壞器調用機制,但Delphi的Object Pascal版本1及2卻不具備這一能力(在這種語言中,破壞器的含義與用法都發生了變化)。

除將內存設回原始狀態以外,若要設置另一些東西,finally就是必需的。例如,我們有時需要打開一個文件或者建立一個網絡連接,或者在屏幕上畫一些東西,甚至設置外部世界的一個開關,等等。如下例所示:
 

//: OnOffSwitch.java
// Why use finally?

class Switch {
  boolean state = false;
  boolean read() { return state; }
  void on() { state = true; }
  void off() { state = false; }
}

public class OnOffSwitch {
  static Switch sw = new Switch();
  public static void main(String[] args) {
    try {
      sw.on();
      // Code that can throw exceptions...
      sw.off();
    } catch(NullPointerException e) {
      System.out.println("NullPointerException");
      sw.off();
    } catch(IllegalArgumentException e) {
      System.out.println("IOException");
      sw.off();
    }
  }
} ///:~


這裡的目標是保證main()完成時開關處於關閉狀態,所以將sw.off()置於try塊以及每個違例控制器的末尾。但產生的一個違例有可能不是在這裡捕獲的,這便會錯過sw.off()。然而,利用finally,我們可以將來自try塊的關閉代碼只置於一個地方:
 

//: WithFinally.java
// Finally Guarantees cleanup

class Switch2 {
  boolean state = false;
  boolean read() { return state; }
  void on() { state = true; }
  void off() { state = false; }
}

public class WithFinally {
  static Switch2 sw = new Switch2();
  public static void main(String[] args) {
    try {
      sw.on();
      // Code that can throw exceptions...
    } catch(NullPointerException e) {
      System.out.println("NullPointerException");
    } catch(IllegalArgumentException e) {
      System.out.println("IOException");
    } finally {
      sw.off();
    }
  }
} ///:~


在這兒,sw.off()已移至一個地方。無論發生什麼事情,都肯定會運行它。
即使違例不在當前的catch從句集裡捕獲,finally都會在違例控制機制轉到更高級別搜索一個控制器之前得以執行。如下所示:
 

//: AlwaysFinally.java
// Finally is always executed

class Ex extends Exception {}

public class AlwaysFinally {
  public static void main(String[] args) {
    System.out.println(
      "Entering first try block");
    try {
      System.out.println(
        "Entering second try block");
      try {
        throw new Ex();
      } finally {
        System.out.println(
          "finally in 2nd try block");
      }
    } catch(Ex e) {
      System.out.println(
        "Caught Ex in first try block");
    } finally {
      System.out.println(
        "finally in 1st try block");
    }
  }
} ///:~


該程序的輸出展示了具體發生的事情:
 

Entering first try block
Entering second try block
finally in 2nd try block
Caught Ex in first try block
finally in 1st try block

若調用了break和continue語句,finally語句也會得以執行。請注意,與作上標簽的break和continue一道,finally排除了Java對goto跳轉語句的需求。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved