nullによる初期化回避の解答例
nullによる初期化を回避せよ - @katzchang.contextsの解答例です。方針としては「"FileInputStream stream"の宣言とクローズをブロック内で閉じる」が全てです。
解答例1は例外処理を階層化させる考え方で、構造化(大規模への対応)しやすいのが利点です。解答例2は例外処理を最後にまとめた、元の構成に概ねそった考え方です。
解答例2は、元のコードの動作とは微妙な違いがあるけど(NumberFormatExceptionが出つつファイルを閉じれない場合、エラーメッセージの出力順が逆になるとか)、例外処理の記述がまとまってて見やすいのが利点です。finallyブロックの中、stream.close()のtry〜catch句は省略してしまっても許されるとしたら*1、元コードと比較してかなりスッキリすると思います。catch句なしのtry〜finally句ってほとんど使ったことなかったけど、意外と綺麗に書けるかもね。
どちらの例でも、元コードのfinallyブロックにあったnullチェック「if (stream != null)」が不要になるので、バグの可能性を確実に減らすことができる。null初期化を回避した利点ですかね。
解答例1
import java.io.*; public class Foo { public static void main(String[] args) { File file = new File("hoge.txt"); try { FileInputStream stream = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); try { int sum = 0; String line; while((line = reader.readLine()) != null) { System.out.println("adding..." + line); sum += Integer.valueOf(line); } System.out.println(sum); } catch (NumberFormatException e) { System.err.println("ファイルの形式が変です。"); } catch (IOException e) { System.err.println("入出力に問題があるようです。"); } finally { try { stream.close(); } catch (IOException e) { System.err.println("ファイルを閉じられないようです。"); } } } catch (FileNotFoundException e) { System.err.println("ファイルがないようです。"); } } }
解答例2
import java.io.*; public class Foo { public static void main(String[] args) { File file = new File("hoge.txt"); try { FileInputStream stream = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); try { int sum = 0; String line; while((line = reader.readLine()) != null) { System.out.println("adding..." + line); sum += Integer.valueOf(line); } System.out.println(sum); } finally { try { //このtry〜catch句は必要? stream.close(); } catch (IOException e) { System.err.println("ファイルを閉じられないようです。"); } } } catch (NumberFormatException e) { System.err.println("ファイルの形式が変です。"); } catch (FileNotFoundException e) { System.err.println("ファイルがないようです。"); } catch (IOException e) { System.err.println("入出力に問題があるようです。"); } } }
*1:システムエラー以外で、ファイルを開けるのに閉じれないってどういうケースがありえるんだろうか?正直、よくわかんない。