也许有一位 Java 内部专家。 我在理解以下 Java 代码的编译代码时遇到问题
public class TestException
{
public static void main(String[] args)
{
StringBuilder sb = null;
try
{
sb = new StringBuilder(null);
}
catch (NullPointerException t)
{
}
if (sb != null)
{
System.out.print(sb.toString());
}
}
}
这将编译为:
stack=3, locals=3, args_size=1
0: aconst_null
1: astore_1
2: new #2 // class java/lang/StringBuilder
5: dup
6: aconst_null
7: invokespecial #3 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
10: astore_1
11: goto 15
14: astore_2
15: aload_1
16: ifnull 29
19: getstatic #5 // Field java/lang/System.out:Ljava/io/OutStream;
22: aload_1
23: invokevirtual #6 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
26: invokevirtual #7 // Method java/io/OutStream.print:(Ljava/lang/String;)V
29: return
Exception table:
from to target type
2 11 14 Class java/lang/NullPointerException
我的问题: 在第 7 行,堆栈内容为
- 引用 StringBuilder 实例
- 引用 StringBuilder 实例
- 无
在调用 StringBuilder(String) 后,最后两个参数将被删除,因此堆栈只包含
- 引用 StringBuilder 实例
这对于正常执行是可以的,但是当出现异常时(地址 14),堆栈将看起来像
- 引用 StringBuilder 实例
- 引用异常实例
在将异常 ref 存储在本地 var 2 中之后,因此在 catch 结束时,堆栈中仍有对 stringbuilder 的 ref。
谁能指出我哪里出错了?
谢谢, 冈特
最佳答案
此行为是预期的。您调用了 new StringBuilder(null)
,然后有一个 StringBuilder
的实例,即使已抛出异常也是如此。
当然,这个对象永远不会(也不能)被操作,因为它没有引用:sb
是null
。垃圾收集器将随时收集这个未使用的对象,但 JVM 拥有控制权,您无法预测其行为。
关于java - 构造函数中出现异常时java编译器出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21429269/