2012年6月29日金曜日

Java 7 の try-with-resources をさわってみるを、突っ込まれる的な

はい、Javaバイトコードが読めないみけです。



本題


昨日のこのタイトルとほぼ同名の記事を書いた後にさくらばさんに

アドバイスもらいました。



おお、そういえば、いろふさんブログにもあったような…

Throwable#getSuppressed() なるものがあって、最初に投げられた例外に

そのあとに投げられた例外が保存されているようです。


気を取り直して


昨日のコードを書きなおしてみました。



catchの部分で他に例外がsuppressされていないか確認してみました。

で、実行結果がこれです。



メソッド実行中とクローズ中に発生した例外について、

メソッド実行中の例外にクローズ中に発生した例外がsuppressされているのが確認できます。

実際、どうなってんの?


さて、さくらばさんからこんなアドバイスももらっています。



というわけで、デコンパイルしてみようとしたらJDってツールがダウンロード出来ない…(´・ω・`)

Jadの方をダウンロードしてデコンパイルしてみました。



ところどころ残念なことになってはいますが、まあ読めますね。

メソッド実行中とクローズ中の例外に例外が発生するパターンでは…

  • 52行目のtryからが本来のtryに該当するところで、55行目のact.something()で例外が発生。
  • 63行目と64行目の条件はtrueになるので、67行目のact.close()を実行して例外が発生。
  • 二度目に発生した例外は69行目のcatchで捕まって、71行目で最初に発生した例外にaddSuppressed(java.lang.Throwable)される。
  • 76行目以降の同じようなコードはここまで例外が発生しなかった場合のautoclose()処理ですかね。
  • 92行目以降のe;ってなってるのは本来のJavaコードのcatch部分で、各例外のハンドリングが実施される。

といった感じでしょうか。

なるほど、こういう風にコンパイル時にコードが展開されるんですね。

副作用


というわけで、昨日の記事を訂正したんですが、

どうやらバイトコードに興味を持ちました。

で、そういったあたりをTwitterで呟いたら



ツイッター怖っ!

0 件のコメント:

コメントを投稿