javaのtry-with-resources文の後処理の話

システム開発Tips

ん?動きが違うの・・・?

今日は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マッパーとか使うだろうし、

それに伴ってコネクションプーリングすると思うので業務システム的には関係ないかもですがね。

フォローお願いします!

コメント

タイトルとURLをコピーしました