我正在尝试在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进行组装)时,我不知道如何定义其中之一。有人可以告诉我创建异常表的秘密吗?并可能给我一个将与jasmin结合使用的异常处理示例?
最佳答案
最后,我想出了一个比jsr
更好的解决方案-在Jasmin中使用.method
定义一个方法。一旦检测到错误,我就使用invokestatic
调用我的错误处理程序。
对于那些寻求实际异常处理的人-我认为可以使用.catch
在Jasmin中定义异常表,但是由于方法定义解决了我的问题,因此我没有对其进行研究。
编辑:
最后,我确实需要查看.catch
,发现它确实很容易使用。它已记录为here。