finally
なんか勘違いしてるプログラムを見た。
BufferedReader in1 = null; BufferedReader in2 = null; try { ... } finally { if (in1 != null) in1.close(); if (in2 != null) in2.close(); }
確かにfinallyブロックにはほとんど必ず入る*1けど、イコールfinallyブロックの処理が全部実行されるわけではない。
上の例だと、in1.close()で例外が発生したらin2はクローズされない。こんなのは当たり前だと思ってたんだけど、なんかどうもそうではないらしい。
上でもしどっちも実行されるのなら、そもそも
try { } finally { BufferedReader in1 = new BufferedReader(...); BufferedReader in2 = new BufferedReader(...); ... in1.close(); in2.close(); }
こう書ける事になる。さすがに、これを変だと思わない人はいないだろうけど・・・
*1:System.exit(0)とかやると入らない