亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

Java中的構建器

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

  為違例編寫代碼時,我們經常要解決的一個問題是:“一旦產生違例,會正確地進行清除嗎?”大多數時候都會非常安全,但在構建器中卻是一個大問題。構建器將對象置于一個安全的起始狀態,但它可能執行一些操作——如打開一個文件。除非用戶完成對象的使用,并調用一個非凡的清除方法,否則那些操作不會得到正確的清除。若從一個構建器內部“擲”出一個違例,這些清除行為也可能不會正確地發生。所有這些都意味著在編寫構建器時,我們必須非凡加以留意。
  由于前面剛學了finally,所以大家可能認為它是一種合適的方案。但事情并沒有這么簡單,因為finally每次都會執行清除代碼——即使我們在清除方法運行之前不想執行清除代碼。因此,假如真的用finally進行清除,必須在構建器正常結束時設置某種形式的標志。而且只要設置了標志,就不要執行finally塊內的任何東西。由于這種做法并不完美(需要將一個地方的代碼同另一個地方的結合起來),所以除非非凡需要,否則一般不要嘗試在finally中進行這種形式的清除。
  在下面這個例子里,我們創建了一個名為InputFile的類。它的作用是打開一個文件,然后每次讀取它的一行內容(轉換為一個字串)。它利用了由java標準IO庫提供的FileReader以及BufferedReader類(將于第10章討論)。這兩個類都非常簡單,大家現在可以毫無困難地把握它們的基本用法:
  
  //: Cleanup.java
  // Paying attention to exceptions
  // in constrUCtors
  import java.io.*;
  
  class InputFile {
   PRivate BufferedReader in;
   InputFile(String fname) throws Exception {
    try {
     in =
      new BufferedReader(
       new FileReader(fname));
     // Other code that might throw exceptions
    } catch(FileNotFoundException e) {
     System.out.println(
      "Could not open " + fname);
     // Wasn't open, so don't close it
     throw e;
    } catch(Exception e) {
     // All other exceptions must close it
     try {
      in.close();
     } catch(IOException e2) {
      System.out.println(
       "in.close() unsuccessful");
     }
     throw e;
    } finally {
     // Don't close it here!!!
    }
   }
   String getLine() {
    String s;
    try {
     s = in.readLine();
    } catch(IOException e) {
     System.out.println(
      "readLine() unsuccessful");
     s = "failed";
    }
    return s;
   }
   void cleanup() {
    try {
     in.close();
    } catch(IOException e2) {
     System.out.println(
      "in.close() unsuccessful");
    }
   }
  }
  
  public class Cleanup {
   public static void main(String[] args) {
    try {
     InputFile in =
      new InputFile("Cleanup.java");
     String s;
     int i = 1;
     while((s = in.getLine()) != null)
      System.out.println(""+ i++ + ": " + s);
     in.cleanup();
    } catch(Exception e) {
     System.out.println(
      "Caught in main, e.printStackTrace()");
     e.printStackTrace();
    }
   }
  } ///:~
  
  該例使用了Java 1.1 IO類。
  用于InputFile的構建器采用了一個String(字串)參數,它代表我們想打開的那個文件的名字。在一個try塊內部,它用該文件名創建了一個FileReader。對FileReader來說,除非轉移并用它創建一個能夠實際與之“交談”的BufferedReader,否則便沒什么用處。注重InputFile的一個好處就是它同時合并了這兩種行動。
  若FileReader構建器不成功,就會產生一個FileNotFoundException(文件未找到違例)。必須單獨捕捉這個違例——這屬于我們不想關閉文件的一種非凡情況,因為文件尚未成功打開。其他任何捕捉從句(catch)都必須關閉文件,因為文件已在進入那些捕捉從句時打開(當然,假如多個方法都能產生一個FileNotFoundException違例,就需要稍微用一些技巧。此時,我們可將不同的情況分隔到數個try塊內)。close()方法會擲出一個嘗試過的違例。即使它在另一個catch從句的代碼塊內,該違例也會得以捕捉——對Java編譯器來說,那個catch從句不過是另一對花括號而已。執行完本地操作后,違例會被重新“擲”出。這樣做是必要的,因為這個構建器的執行已經失敗,我們不希望調用方法來假設對象已正確創建以及有效。
  在這個例子中,沒有采用前述的標志技術,finally從句顯然不是關閉文件的正確地方,因為這可能在每次構建器結束的時候關閉它。由于我們希望文件在InputFile對象處于活動狀態時一直保持打開狀態,所以這樣做并不恰當。
  getLine()方法會返回一個字串,其中包含了文件中下一行的內容。它調用了readLine(),后者可能產生一個違例,但那個違例會被捕捉,使getLine()不會再產生任何違例。對違例來說,一項非凡的設計問題是決定在這一級完全控制一個違例,還是進行部分控制,并傳遞相同(或不同)的違例,或者只是簡單地傳遞它。在適當的時候,簡單地傳遞可極大簡化我們的編碼工作。getLine()方法會變成:
  String getLine() throws IOException {
  return in.readLine();
  }
  但是當然,調用者現在需要對可能產生的任何IOException進行控制。
  用戶使用完畢InputFile對象后,必須調用cleanup()方法,以便釋放由BufferedReader以及/或者FileReader占用的系統資源(如文件句柄)——注釋⑥。除非InputFile對象使用完畢,而且到了需要棄之不用的時候,否則不應進行清除。大家可能想把這樣的機制置入一個finalize()方法內,但正如第4章指出的那樣,并非總能保證finalize()獲得正確的調用(即便確定它會調用,也不知道何時開始)。這屬于Java的一項缺陷——除內存清除之外的所有清除都不會自動進行,所以必須知會客戶程序員,告訴他們有責任用finalize()保證清除工作的正確進行。
  
  ⑥:在C++里,“破壞器”可幫我們控制這一局面。
  
  在Cleanup.java中,我們創建了一個InputFile,用它打開用于創建程序的相同的源文件。同時一次讀取該文件的一行內容,而且添加相應的行號。所有違例都會在main()中被捕捉——盡管我們可選擇更大的可靠性。
  這個示例也向大家展示了為何在本書的這個地方引入違例的概念。違例與Java的編程具有很高的集成度,這主要是由于編譯器會強制它們。只有知道了如何操作那些違例,才可更進一步地把握編譯器的知識。

上一篇:Java違例準則

下一篇:Java的延遲綁定

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩美女在线观看| 国产一区二区三区免费视频| 日本精品久久电影| 亚洲天堂成人在线| 日韩电影中文字幕一区| 国产成人福利网站| 日韩精品在线免费观看| 中文字幕无线精品亚洲乱码一区| 日产精品久久久一区二区福利| 亚洲精品wwwww| 97视频在线观看成人| 91嫩草在线视频| 成人性生交大片免费看小说| 欧美在线影院在线视频| 都市激情亚洲色图| 亚洲免费av网址| 中文字幕精品av| 欧美性猛交xxxx黑人| 国产精品久久久久久久久男| 亚洲精品国产精品久久清纯直播| 色一情一乱一区二区| 国产精品大陆在线观看| 国产欧美在线播放| 日韩久久精品电影| 久久久影视精品| 久久精品国产成人| 欧美精品www| 日韩中文字幕在线视频播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久视频在线| 亚洲成人a**站| 欧美www在线| 亚洲自拍另类欧美丝袜| 国产精品精品视频| 91九色单男在线观看| 欧美亚洲午夜视频在线观看| 午夜精品久久久久久久男人的天堂| 欧美亚洲日本网站| 成人精品在线视频| 欧美人交a欧美精品| 久热精品视频在线观看一区| 久久久久久com| 国产精品99久久久久久人| 91精品国产自产在线观看永久| 久久久影视精品| 精品国内亚洲在观看18黄| 欧美特黄级在线| 日韩电影大片中文字幕| 久久亚洲精品网站| 一本色道久久综合狠狠躁篇的优点| 欧美亚洲视频一区二区| 久久久日本电影| 国产色视频一区| 亚洲美女性生活视频| 亚洲欧美日韩精品久久奇米色影视| 国产不卡一区二区在线播放| 久久久亚洲成人| 日本精品一区二区三区在线播放视频| 日韩电影在线观看免费| 色综合伊人色综合网站| 成人h猎奇视频网站| 久久久久久国产精品美女| 国产精品视频地址| 91夜夜揉人人捏人人添红杏| 亚洲国产精品va在线看黑人动漫| 欧美电影在线观看| 国产欧美精品一区二区三区介绍| 日本最新高清不卡中文字幕| 日韩av在线网站| 午夜精品国产精品大乳美女| 欧美成人在线免费视频| 国产一区二区三区在线| 欧美视频在线观看 亚洲欧| 亚洲一区二区国产| 亚洲国产日韩精品在线| 欧美极品少妇xxxxⅹ喷水| 欧洲成人午夜免费大片| 美女久久久久久久久久久| 亚洲少妇激情视频| 亚洲精品wwww| 久久影视电视剧免费网站清宫辞电视| 91精品久久久久久久久青青| 中文字幕亚洲欧美一区二区三区| 亚洲第一精品夜夜躁人人爽| 亚洲黄色www网站| 欧美在线观看www| 欧美激情乱人伦一区| 欧美不卡视频一区发布| 国产综合视频在线观看| 777国产偷窥盗摄精品视频| 欧美成人精品h版在线观看| 国产精品欧美日韩| 7m精品福利视频导航| 秋霞av国产精品一区| 少妇精69xxtheporn| 欧美专区在线播放| 国产欧美在线观看| 欧美日韩国产91| 欧美大片免费观看在线观看网站推荐| 成人国产精品一区| 成人做爰www免费看视频网站| 亚洲国产精品电影在线观看| 中文字幕日本欧美| 俺也去精品视频在线观看| 欧美成人精品三级在线观看| 亚洲风情亚aⅴ在线发布| 久久精品国产一区二区电影| 亚洲欧美在线看| 日韩精品在线观看网站| 欧美日韩一区二区免费视频| 在线视频中文亚洲| 亚洲色图五月天| 久久视频免费观看| 亚洲国产精品系列| 亚洲香蕉伊综合在人在线视看| 懂色aⅴ精品一区二区三区蜜月| 国产精品入口免费视| 久久99视频精品| 国产日韩换脸av一区在线观看| 国产精品久久久久久一区二区| 成人免费在线视频网址| 欧美激情一区二区三区久久久| 欧美激情国产高清| 国产精品久久99久久| 亚洲人成网站色ww在线| 最近2019中文字幕大全第二页| 国产欧美日韩中文字幕| 日韩av在线最新| 777精品视频| 欧美超级免费视 在线| 久久91精品国产91久久跳| 亚洲一区二区三区在线视频| 欧洲成人免费视频| 尤物精品国产第一福利三区| 国产福利视频一区二区| 日韩中文理论片| 成人激情视频网| 国产成人精品视频| 欧美激情精品久久久久久大尺度| 国a精品视频大全| 欧美精品午夜视频| www.亚洲免费视频| 欧美三级xxx| 国产高清在线不卡| 日韩av不卡电影| 色www亚洲国产张柏芝| 亚洲欧洲中文天堂| 亚洲免费av电影| 国产亚洲视频中文字幕视频| 国产视频丨精品|在线观看| 色综合久久天天综线观看| 欧美激情在线狂野欧美精品| 亚洲激情成人网| 国产精品av免费在线观看| 国产精品女主播视频| 午夜精品视频网站| 欧美高清性猛交| 在线视频亚洲欧美| 国产亚洲一区二区在线| 国产精品网红福利| 在线观看欧美日韩国产| 欧美精品在线免费| 日韩欧美福利视频| 久久免费精品日本久久中文字幕|