麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用finally做什么

2019-11-18 13:19:57
字體:
供稿:網(wǎng)友

  在沒有“垃圾收集”以及“自動(dòng)調(diào)用破壞器”機(jī)制的一種語言中(注釋⑤),finally顯得非凡重要,因?yàn)槌绦騿T可用它擔(dān)保內(nèi)存的正確釋放——無論在try塊內(nèi)部發(fā)生了什么狀況。但java提供了垃圾收集機(jī)制,所以內(nèi)存的釋放幾乎絕對(duì)不會(huì)成為問題。另外,它也沒有構(gòu)建器可供調(diào)用。既然如此,Java里何時(shí)才會(huì)用到finally呢?
  
 ?、荩骸捌茐钠鳌保―estrUCtor)是“構(gòu)建器”(Constructor)的反義詞。它代表一個(gè)非凡的函數(shù),一旦某個(gè)對(duì)象失去用處,通常就會(huì)調(diào)用它。我們肯定知道在哪里以及何時(shí)調(diào)用破壞器。C++提供了自動(dòng)的破壞器調(diào)用機(jī)制,但Delphi的Object Pascal版本1及2卻不具備這一能力(在這種語言中,破壞器的含義與用法都發(fā)生了變化)。
  
  除將內(nèi)存設(shè)回原始狀態(tài)以外,若要設(shè)置另一些東西,finally就是必需的。例如,我們有時(shí)需要打開一個(gè)文件或者建立一個(gè)網(wǎng)絡(luò)連接,或者在屏幕上畫一些東西,甚至設(shè)置外部世界的一個(gè)開關(guān),等等。如下例所示:
  
  //: 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();
    }
   }
  } ///:~
  
  這里的目標(biāo)是保證main()完成時(shí)開關(guān)處于關(guān)閉狀態(tài),所以將sw.off()置于try塊以及每個(gè)違例控制器的末尾。但產(chǎn)生的一個(gè)違例有可能不是在這里捕捉的,這便會(huì)錯(cuò)過sw.off()。然而,利用finally,我們可以將來自try塊的關(guān)閉代碼只置于一個(gè)地方:
  
  //: 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()已移至一個(gè)地方。無論發(fā)生什么事情,都肯定會(huì)運(yùn)行它。
  即使違例不在當(dāng)前的catch從句集里捕捉,finally都會(huì)在違例控制機(jī)制轉(zhuǎn)到更高級(jí)別搜索一個(gè)控制器之前得以執(zhí)行。如下所示:
  
  //: 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");
    }
   }
  } ///:~
  
  該程序的輸出展示了具體發(fā)生的事情:
  
  Entering first try block
  Entering second try block
  finally in 2nd try block
  Caught Ex in first try block
  finally in 1st try block
  
  若調(diào)用了break和continue語句,finally語句也會(huì)得以執(zhí)行。請(qǐng)注重,與作上標(biāo)簽的break和continue一道,finally排除了Java對(duì)goto跳轉(zhuǎn)語句的需求。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: av国产片| 一区二区精品视频 | 精品免费国产一区二区三区 | 午夜在线成人 | 三人弄娇妻高潮3p视频 | 国产成人小视频在线观看 | 在线视频观看国产 | 成人免费观看在线视频 | 草草视频免费 | 99seav| 美国一级毛片片aa久久综合 | 色999中文字幕 | 亚洲欧美在线看 | 伊人久久国产精品 | 久久久久久久久久亚洲 | av电影院在线观看 | 国产女厕一区二区三区在线视 | a级高清免费毛片av在线 | 午夜精品影院 | 色网站在线免费观看 | videos高潮| 国产婷婷一区二区三区 | javhdfreejaⅴhd | 午夜久久电影 | 亚州精品在线视频 | 中国hd高清xxxxvideo | 国产一级毛片高清 | 成人毛片免费 | 国产亚洲综合一区二区 | 久久久涩 | 成av在线 | 日韩精品二区 | 国产一区精品在线观看 | 国产成人午夜高潮毛片 | 亚洲欧美日韩中文在线 | xxxxxx中国 | 国产精品刺激对白麻豆99 | 欧美xxxxx视频 | 成人做爽爽爽爽免费国产软件 | 91网站在线观看视频 | 男人久久天堂 |