うごく生ゴミプログラマの備忘録

うごく生ゴミ 〜再臨〜

ファイルの読み込みを Java SE7 から追加された try-with-resources文 を使って書き直す

Java SE7 から追加された try-with-resources文 の使い方を、SE6 以前の書き方との比較も含めてメモっとく。 普段の業務では SE6 しか使ってないから、資格の勉強で1度覚えても忘れちゃうんよな。 (サンプルのソースは Java SE6 以前の方も SE7 以降の try-with-resources文使用ヴァージョンも テキストファイル「test.txt」の内容をすべて出力するという物 )

まず、Java SE6 以前での書き方。 ポイントは finally 句で close() すること。 また、その際に BufferedReader のインスタンスが null である場合を考慮して if で処理を分岐すること。 これしとかないと NullPointerException が発生してしまう。

    public static void main( String[] args ) {

        BufferedReader br = null;
        try {

            br = new BufferedReader( new FileReader( "./test.txt" ) );
            String text;
            while ( (text = br.readLine()) != null ) {
                
                System.out.println( text );
            }
        } catch ( IOException e ) {

            e.printStackTrace();

        } finally {

            if ( br != null ) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

で、Java SE7 から追加された try-with-resources文 を使用したヴァージョン。 見た目での一番の違いは

try の後いきなり () 小かっこが登場しているところ。 この中かっこの中には、 ・java.lang.AutoCloseable ・java.io.Closeable のどちらかのインタフェースの実装クラスのリソースの生成処理を書く。

ここ、Oracle 認定 Java Programmer SE7 GOLD で必ず試験に出ます。(個人の感想です。)

また、この小かっこの中では複数のリソースの生成処理を書くこともできる。(ここに関してはまた今度書く。) で、小かっこの中に生成したリソースは自動的に close() が呼ばれ、解放される。

次に、なんやこれ?ってところは finnaly 句でやってる

e.getSuppressed();

getSuppressed() は Java SE7 で Throwable クラスに追加されたメソッドで、抑制された例外の配列を取得するメソッドであり、ここれは、自動的に呼び出された close() メソッド実行中に発生した例外を取得している。

Java SE6 以前のソースと比較すると、それまで finnaly 句でやっていた close するための分岐やら何やらが無くなってすっきりしている気がする。 自前で書かなきゃいけない内容があると、それだけいらんミスする可能性が増えるしね。

    public static void main ( String[] args ) {
        
        try ( BufferedReader br = new BufferedReader( new FileReader("./text.txt") ); ) {

            String text;
            while ( (text = br.readLine()) != null ) {
                
                System.out.println( text );
            }
        } catch ( IOException e ) {
            
            e.printStackTrace();

            Throwable[] suppressedArr = e.getSuppressed();
            for ( Throwable throwable : suppressedArr ) {

                throwable.printStackTrace();
            } 
        }
    }