try~with~resources リソース解放されない

今更ではあるが、try~with~resources 文が便利で、ついうっかりこう書いてしまう。

File file = ....;

try(PrintWriter pw = new PrintWriter(new BufferedWriter(
                                     new OutputStreamWriter(
                                     new FileOutputStream(file, file.exists()), "MS932")))){

}

これには罠があって、try() 文の中のコンストラクタでエラーが起こると、
リソース解放されないまま終わってしまう。

try( FileOutputStream out = new FileOutputStream(file, file.exists());
     OutputStreamWriter ow =  new OutputStreamWriter(out, "MS932");
     BufferedWriter bw = new BufferedWriter(ow);
     PrintWriter pw = new PrintWriter(bw)
){

}

長くなって嫌でもリスク回避ではこうすべきなのだ。