ん?動きが違うの・・・?
今日はJavaの話です。
Java7でtry-with-resources文が追加されてから、例外処理を実装するときには同文を使用していたのですが、try-with-resources文とtry-catch-finally文(便宜上そう呼びます)では動きが違うようだったのでメモ書き。
結論から言うと今冷静になって考えると当然なんですが、以下の処理でtry-with-resources文
の方はエラーになります。
それは、httpServletResponseでsendRedirectしているのですが、
その中のServletOutputStreamが例外が発生した次点でcloseされているためです。
…直接見えてなかったので、気づくのに時間がかかりました。
try-catch-finally文
OutputStream stream = res.getOutputStream();
try {
// なんかの処理
} catch (Exception e) {
// リダイレクト
res.sendRedirect(/*xxx*/);
} finally {
stream.close();
}
try-with-resources文
// ServletOutputStreamはAutoCloseableを実装しているのでtry-with-resources文を抜けるときに終了処理が動く
try (OutputStream stream = res.getOutputStream();) {
// なんかの処理
} catch (Exception e) {
// リダイレクト
res.sendRedirect(/*xxx*/);
}
気づいてみれば納得の理由。
気持ちcatch抜けてからかなと思ってたのですが、try抜けたらAutoCloseableが動作するようです。
DB コネクションとかはtry-with-resources文
で書いて、しまうとcatchでrollbackとかできなくなってしまいますね。それはよくない。
まぁでも、
そもそもDBアクセス実装時にはどうせMyBatisとかSpring JDBCなどのORマッパーとか使うだろうし、
それに伴ってコネクションプーリングすると思うので業務システム的には関係ないかもですがね。
コメント