2016-08-16 7 views
-1

JDK 6以下では、以下のようにtry-finallyブロックを含む多くのコードスニペットが見られました。Java try - finally design

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

なぜ、リーダーをnullに初期化してtryブロックに割り当てるのですか?私は何かが不足している場合は、テンプレートより良いだろうか?私の理由は...私たちは最終的にブロックでヌルチェックを避け、リーダーが初期化に失敗した場合、私は他の何かをする必要はありません。

+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 2つのリソースを使用することを決めた場合、それをサポートするためにコードをリファクタリングする必要はありません。 – Compass

関連する問題