2016-08-16 26 views
-1

隨着JDK 6和以下我看到了許多代碼片段與try-finally塊如下。Java嘗試 - 終於設計

private void doSomething() throws IOException { 
    FileReader reader = null; 
    try { 
     reader = new FileReader("someFile"); 
     ..... 
    } finally { 
     if(reader != null){ 
      reader.close(); 
     } 
    } 
} 

爲什麼初始化reader爲null,然後在try塊中分配它。下面的模板會更好(想知道我是否缺少任何東西)?我的理由是...我們避免了最終阻止空檢查,如果讀者未能初始化,那麼我不必做任何事情。

private void doSomething() throws IOException { 
    FileReader reader = new FileReader("someFile"); 
    try { 

     ..... 
    } finally { 
     reader.close(); 
    } 
} 
+0

不是真的!如果構造函數拋出異常,那麼該方法的其餘部分無論如何都無關緊要。請參閱throws子句? – Stackee007

回答

0

單獨,聲明沒有問題,但是當你添加更多需要關閉的資源時,你開始得到一堆未關閉的資源。最好在null之外聲明它們,然後用finally處理。

執行不力

private void doSomething() throws IOException { 
    FileReader reader = new FileReader("someFile"); 
    FileWriter writer = new FileWriter("someFile2"); //throws exception 
    try { 

     ..... 
    } finally { 
     reader.close(); 
     writer.close(); 
    } 
} //reader remains unclosed 

現在我們有一個未關閉的FileReader因爲另一個構造函數拋出異常。

正確執行

private void doSomething() throws IOException { 
    FileReader reader = null; 
    FileWriter writer = null; 
    try { 
     reader = new FileReader("someFile"); 
     writer = new FileWriter("someFile2"); //throws exception 
    } finally { 
     if(reader != null) 
      reader.close(); //closes properly 
     if(writer != null) //skipped 
      writer.close(); 
    } 
} 
+0

我沒有處理多個資源...所以這不適用 – Stackee007

+0

@ Stackee007這是慣例,如果您決定使用兩種資源,您將不必重構代碼以支持它。 – Compass