Java SE6まではファイル入出力やデータベースへのアクセスをするとき、そのためのリソース(プログラムでの使用が終わったら閉じられなければいけないオブジェクト)を解放するために、例外処理のfinally句などでclose処理を記述していました。ですが、アクセスがある度にclose処理を書くのが面倒、書き忘れるとメモリリークの原因になる等少々手間のかかるものでした。
そこで、Java SE7から追加されたtry-with-resources文を使うとこれらの問題が解決できるというわけで、今回はその機能紹介とサンプルコードをご紹介したいと思います。
try-with-resources文
はじめに、try-with-resources文を使用するにはjava.lang.AutoCloseableかjava.io.Closeableインターフェースを実装するクラスである必要があります。このインターフェースにはclose()メソッドのみ定義されており、ファイル入出力のjava.ioやデータベースアクセスのjava.sqlパッケージなどのリソース関連クラスは、これらのインターフェースを実装しているため、暗黙的に解放することができます。
使用方法としては、まず例外処理try(){}ブロックの()内にリソースを書き込みます。すると、この()内に書かれたリソースプログラムはコードブロックの終わりで各リソースが確実に閉じられるという仕様になっているのです。
では実際にSE6までのサンプルとSE7のサンプルを見比べてみましょう。
SE6までのサンプル
※サンプルはjava.ioパッケージを使ったファイル入出力例文
1 2 3 4 5 6 7 8 9 10 |
static String readFile(String path) { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } catch (IOException e){ e.printStackTrace(); } finally { if (br != null) br.close(); } } |
SE6以前ではfinallyブロック内にストリームのクローズ処理を書いていたが、SE7ではそれをtry-with-resources文で行う事が可能です。
SE7以降のサンプル
1 2 3 4 5 6 7 |
static String readFile(String path) { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } catch (IOException e){ e.printStackTrace(); } } |
これでclose処理から解放されますね!是非使ってみて下さい!!