【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.Closeable
かjava.io.AutoCloseable
を実装しているクラスなので注意が必要。
つまり、独自クラスでもこれらを実装していればこの構文で使用できる。