どうもコウタロウです。
今日はタイトルについて。
ファイルのクローズ忘れ
先日、プロジェクトでファイルのクローズ忘れが発覚しました。
ある程度は、仕組み化、テンプレート化して同じようなソースになるよう心がけていたんですが、ファイルのオープン、クローズはそんなに難しくない処理であり、各個人に任せてたんですがそれが良くなかった。
不具合修正している時に、「あれ? クローズしてない」って気づきました。
クローズ忘れを防ぐtry、resources
改めて、どうすればいいか考えたらJava7から便利な記述方法ができるようになりました。
それは「try-with-resources」文です。
ファイルや、データベースなど、オープンしたらクローズしなければいけないですが、クローズを記載するコードは結構冗長的で可読性も悪く、且つ記述し忘れもあります。
そこで登場したのがtry-with-resources文!!
旧来のファイルクローズ
早速今までのファイルクローズを見てみましょう。
gistb2d8812153824d53b8599a0d03cdcd2c
finallyでクローズ処理書いてますが、例外が発生する可能性があるのでさらにtry、catchを記載してるので冗長ですね。
try-with-resources
次にtry-with-resources文です。
gist6c842c7838e9282eaeb264932721925f
try句のカッコにリソースのオープン処理を記載すればクローズ処理は不要です。
BufferedReaderなどAutoCloseableを継承しているクラスは、try句の中に記載すれば、finallyの直前でクローズ処理が自動的に呼ばれます。
ソースもスッキリしてるし、リソースのクローズ忘れもないので、Java7以降をつかってるのであれば、ぜひtry-with-resourcesで記載して下さい!!
また、try句の中をワンライナー(1行)で記載しないのは理由があります。
try-with-resourcesでリソース解放されないパターン – Qiita
Qiitaの記事の通り、ワンライナー上で例外が発生した場合には、クローズされないのであえて、ワンライナーで書いていません。
これ知ってるだけでも大分違いますね。
最後に
私はJava1.3から使ってるんですが、Java6以降の新機能はあまり使いこなしていません。
今回のtry-with-catchや、Java8のラムダ式など。。。
でも、今回のクローズ忘れはJava7の機能try-with-resourcesで防げます。
改めて、新機能をもう一度勉強し直そうと思いました。
※参考までに全ソースを記載します。
コメント