java - 构造函数中出现异常时java编译器出错

标签 java exception compiler-construction constructor

也许有一位 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 行,堆栈内容为

  1. 引用 StringBuilder 实例
  2. 引用 StringBuilder 实例

在调用 StringBuilder(String) 后,最后两个参数将被删除,因此堆栈只包含

  1. 引用 StringBuilder 实例

这对于正常执行是可以的,但是当出现异常时(地址 14),堆栈将看起来像

  1. 引用 StringBuilder 实例
  2. 引用异常实例

在将异常 ref 存储在本地 var 2 中之后,因此在 catch 结束时,堆栈中仍有对 stringbuilder 的 ref。

谁能指出我哪里出错了?

谢谢, 冈特

最佳答案

此行为是预期的。您调用了 new StringBuilder(null),然后有一个 StringBuilder 的实例,即使已抛出异常也是如此。

当然,这个对象永远不会(也不能)被操作,因为它没有引用:sbnull。垃圾收集器将随时收集这个未使用的对象,但 JVM 拥有控制权,您无法预测其行为。

关于java - 构造函数中出现异常时java编译器出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21429269/

相关文章:

c# - .NET 未处理的异常对话框未出现

ruby-on-rails - 异常通知 Gem 和 Rails 3

c# - 除了 System.OutOfMemoryException 之外,string = string 还会抛出哪些异常?

java - 编译 Java 使其表现得像 GO 代码

调用方法时的 C++ 前向声明问题

java - 如何使用 JMS 和 CDI 1.2 查找 EJB

java - 海量多道程序和只读文件访问

c - 奇怪的数组初始化表达式?

java - 如何将元素列表添加到二叉搜索 TreeMap 中?

java - CTCol 对象有什么作用以及它在 POI 中代表什么?