我正在尝试在 java 字节码中进行一些错误处理。我首先尝试实现一些类似于 catch 的子程序,在其中我会检查错误情况,然后跳转到适当的子程序,有点像:
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 组装)时如何定义其中一个。有人能告诉我创建异常表的秘密吗?并可能给我一个将与茉莉花组合的异常处理示例?