国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用finally做什么

2019-11-18 13:19:57
字體:
來源:轉載
供稿:網友

  在沒有“垃圾收集”以及“自動調用破壞器”機制的一種語言中(注釋⑤),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.     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跳轉語句的需求。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁强县| 长沙市| 修水县| 米林县| 东源县| 当阳市| 开远市| 通榆县| 那坡县| 伊宁县| 黔东| 汾阳市| 盱眙县| 云林县| 响水县| 上思县| 武冈市| 灵丘县| 得荣县| 闵行区| 乌苏市| 潞城市| 三明市| 广汉市| 洪洞县| 宜城市| 龙山县| 灵宝市| 安丘市| 潞西市| 水城县| 南华县| 泰和县| 喀喇沁旗| 长泰县| 墨玉县| 集安市| 翁源县| 内乡县| 大同县| 专栏|