Java 7コンパイラはマルチキャッチブロックをどのように処理しますか?単純な実装は、複数のキャッチブロックが存在するかのようにバイトコードを生成することです。ただし、これは当てはまらないことを複数のソースから収集しました。複数の例外タイプを処理するcatchブロックは、コンパイル中に重複するバイトコードを提供しません。
それで、それはどのように機能しますか?マルチキャッチブロックについてJVMに通知する新しいバイトコード命令はありますか?
Java仮想マシン仕様に基づいて、例外は次のようにコンパイルされます(要約)。
multi catch句を使用する場合、catchブロックは同じです(1回だけ表示されます)が、例外テーブルには、同じfrom、to、およびtarget値を持つもう1つのエントリが含まれます。
たとえば、次のコードは次のとおりです。
public static void main(String args[]) throws InterruptedException {
try {
System.out.println("why not?");
} catch (IllegalArgumentException e) {
System.out.println("here");
} catch (IllegalStateException | ArithmeticException e) {
System.out.println("there");
}
}
次の例外テーブルを(私のマシンで)生成します。
from to target type
0 8 11 Class java/lang/IllegalArgumentException
0 8 23 Class java/lang/IllegalStateException
0 8 23 Class java/lang/ArithmeticException
例外テーブルは、すべての例外クラス(例外テーブルのエントリ)を反復処理し、スローされた例外がそれを実装しているかどうかをチェックして、バイトコードのどこにジャンプするかを決定する一種のスイッチのように機能します。
http://www.artima.com/underthehood/exceptions.html
これによると、例外テーブルに新しいエントリを作成するだけで、2つのエントリが同じPCオフセットを指すことができない理由がわかりません。
(免責事項:私はバイトコードの専門家ではなく、何年も触れていないので、何かを見逃す可能性があります)