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)とかやると入らない