12. Java IO: 異常處理

想要查看此教程的目錄請點擊:Java IO教程目錄貼地址


Streams或Readers/Writers在使用過程中需要是可關閉的。這需要調用close()方法。這需要一點兒思考,看下面的代碼:

InputStream input = new FileInputStream("c:\\data\\input-text.txt");

int data = input.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);

  data = input.read();
}
input.close();

這段代碼看起來很好。但是如果doSomethingWithData()方法拋出異常會發生什么?對的!如果發生異常InputStream就不會被關閉了!

下面的代碼避免了這樣的問題:

InputStream input = null;

try{
  input = new FileInputStream("c:\\data\\input-text.txt");

  int data = input.read();
  while(data != -1) {
      //do something with data...
      doSomethingWithData(data);

      data = input.read();
  }
}catch(IOException e){
  //do something with e... log, perhaps rethrow etc.
} finally {
  if(input != null) input.close();
}

注意一下現在InputStream是怎么樣在finally下關閉的。不管在try代碼塊中發生了什么,finally中的代碼都會被執行。所以InputStream總是會被關閉。

但是close()方法如果拋出異常會發生什么?是說stream已經被關閉了?好吧,你可能要用try-catch去catch住這個異常,像下面這樣:

} finally {
  try{
    if(input != null) input.close();
  } catch(IOException e){
    //do something, or ignore.
  }
}

這樣嵌套的去處理問題,看起來非常丑陋,盡管解決了問題。這樣不優雅的異常處理代碼并不夠好,他可以在你的代碼中重復的傳播。如果寫代碼時候比較匆忙,忘記異常處理該怎么辦?

想象一下如果從doSomethingWithData()拋出一個異常,第一個catch捕捉到那個異常,InputStream在finally關閉。但是,如果從input.close()方法拋出一個異常會發生什么?兩個異常中的哪一個應該被傳播到調用堆棧?

幸運的是,有一個方法解決這個問題。解決的辦法是 Exception Handling Templates in Java。創建一個異常處理模板在最后來關閉流。代碼一次寫完,可以在各處重用。可以在Exception Handling Templates in Java學習更多。

Java 7中Java IO 的異常處理

Java7開始有一個新的異常處理機制叫做“try with resources”,它是一個語法糖。這個異常處理機制特別的地方在于你使用資源時需要在使用后關閉,那么用它可以解決這個問題,例如使用InputStream,OutputStream時等等。想要學習和它更多相關的內容可以去Try With Resources in Java 7

.

.

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 六種異常處理的陋習 你覺得自己是一個Java專家嗎?是否肯定自己已經全面掌握了Java的異常處理機制?在下面這段代...
    Executing閱讀 1,366評論 0 6
  • 通俗編程——白話JAVA異常機制 - 代碼之道,編程之法 - 博客頻道 - CSDN.NEThttp://blog...
    葡萄喃喃囈語閱讀 3,197評論 0 25
  • 德培小學第三十二屆家長學校第二次授課
    bc4cae2b5fab閱讀 176評論 0 0
  • 鍥子 今年開春,生活中的瑣事像春湖解凍后湖水泛起的泡沫,終于浮出水面。一天午后,我關掉了手機,獨自開車出門,想要去...
    閑燈兒閱讀 236評論 0 7