フリーランス チャレンジ!!

フリーランス チャレンジ!!

週休4日制に俺はなる!

【Java】ファイルの読み込み、書き込みはtry、resourcesを使おう

f:id:ksakae1216:20170611231202j:plain

どうもコウタロウです。

 

今日はタイトルについて。

 

 

ファイルのクローズ忘れ

先日、プロジェクトでファイルのクローズ忘れが発覚しました。

ある程度は、仕組み、テンプレート化して同じようなソースになるよう心がけていたんですが、ファイルのオープン、クローズはそんなに難しくない処理であり、各個人に任せてたんですがそれが良くなかった。

 

不具合修正している時に、「あれ? クローズしてない」って気づきました。

 

クローズ忘れを防ぐ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で防げます。

改めて、新機能をもう一度勉強し直そうと思いました。

 

※参考までに全ソースを記載します。

gist8764b7c9e1865f8811ae22350549bafb