我正在尝试在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

07-24 09:36
查看更多