8t's BBR

よくつまったあれこれをメモ

【Java】try-catch文でfinallyを省略する【try−with−resource構文】

※java7以降のみ
※記述が少し楽になるだけのお話です


javaで例外処理するときのリソースの後片付けどうしてますか。
私はよくtry−catch文でfinallyを使っていました。
ファイルや接続をclose()処理するのは大事なのはわかってます。
でも、finallyブロック内でまたtry-catch文とかメンドウでメンドウで・・・。

はい、私みたいなJava使いこなせてない芸人の方に朗報です。
題名の通り、try−with−resource構文で省略できるようです。

詳しい話は、Oracle様にお任せするとして、
try-with-resources文
ここでは、覚えておけば良さそうなとこだけ抜粋します。

普通のtry−catch文との違い

百聞は一見にしかずなので、例で見てみます(必要な部分だけの抜粋)

// 例えば、FileWriterを使う場合(普通ver.)
FileWriter fw = null;
try{
    fw = new FileWriter("testdata.txt");
    fw.write("abc");
}catch(IOException e){
    e.printStackTrace();
}finally{
    fw.close();
}
// try-with-resource構文ver.
try( FileWriter fw = new FileWriter("testdata.txt") ){
    fw.write("abc");
}catch(IOException e){
    e.printStackTrace();
}

本来finally文でclose()したいリソースの生成文をtryの後の()内に記述することで、try文が終わった後に自動でclose()してくれるようにするのがtry−with−resource構文です。

リソースが複数ある場合

try文の()内に複数のリソース生成文を記述したい時は、セミコロン;で区切れば良い

try (
    FileReader fr = new FileReader("testdata.txt");
    BufferedReader br = new BufferedReader(br)
) {
    :


try-with-resource構文が使えるリソースのクラス

この構文を使用できるのは、java.io.Closeablejava.io.AutoCloseableを実装しているクラスなので注意が必要。
つまり、独自クラスでもこれらを実装していればこの構文で使用できる。