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:システムエラー以外で、ファイルを開けるのに閉じれないってどういうケースがありえるんだろうか?正直、よくわかんない。