10

我想知道为什么以下字节码中的异常(用于抛出异常)是重复的。

NEW java/lang/IllegalArgumentException
DUP
INVOKESPECIAL java/lang/IllegalArgumentException <init> ()V
ATHROW
4

2 回答 2

20

我将逐行分析这一行,其中 [] = 使用该操作后的新堆栈:

  1. NEW 将一个新IllegalArgumentException的放入堆栈[SomeIllegalArgumentException]
  2. DUP 复制它[SomeIllegalArgumentException, SomeIllegalArgumentException]
  3. INVOKESPECIAL 从顶部弹出并通过调用它的 <init> 方法来初始化它[SomeIllegalArgumentException](init 方法不会返回要放回堆栈的对象,因此必须首先复制对象以使其保留在堆栈中)
  4. ATHROW 抛出另一个(与我们初始化的那个重复)[]
于 2012-09-15T15:23:54.410 回答
10

在字节码中,对象首先由类创建,然后在该对象上调用构造函数。V构造函数的签名以for结尾,void因为它确实返回任何内容。这意味着对对象的原始引用的副本必须保存在堆栈中(或变量中),以便在调用构造函数后可以将其抛出。

顺便说一句,构造函数<init>的内部名称是,静态初始化代码的内部名称是<clinit>

于 2012-09-15T15:22:48.147 回答