Javaバイトコードでエラー処理を行おうとしています。私は最初に、いくつかのキャッチのようなサブルーチンを実装しようとしました。そこでは、エラー状態をチェックし、適切なサブルーチンにジャンプします。
iconst_1
iconst_0
dup
ifeq calldiverr
goto enddivtest
calldiverr:
jsr divError
enddivtest:
idiv
...More instructions...
divError:
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Oh dear you divided by 0!"
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
上記の問題は、このサブルーチンにジャンプする複数の命令がある場合、バイトコードの実行時にスタックの高さが一貫していないというエラーメッセージが表示されることです。
おそらく、例外を使用することがこれを回避するための最良の方法ですか?
いくつかのグーグルから、Exceptionクラスのインスタンスを作成し、次のようなもので初期化できることがわかりました。
new java/lang/Exception
dup
ldc "exception message!"
invokespecial java/lang/Exception/<init>(Ljava/lang/String;)V
私はまた、あなたがそれらを一緒に投げることができることを発見しました、athrow
そしてこれは大丈夫のようです。
しかし、私を混乱させているのは、例外がどのようにキャッチされるかということです。例外のスローとキャッチを結合する魔法の「例外テーブル」があるようですが、バイトコードを最初から作成する(およびJasminを使用して組み立てる)ときにこれらの1つを定義する方法がわかりません。誰かが例外テーブルを作成する秘訣を教えてもらえますか?そして、おそらくジャスミンでアセンブルされる例外処理の例を教えてください。