Java:构造函数抛出异常,我的对象是否仍然可以创建?

jit*_*itm 10 java logic constructor exception

当异常抛出构造函数并且对象不为null时,你能否告诉我一些情况?我的意思是对象的某些部分是创建的,而另一部分则不是.就像这样

public Test(){
name = "John";
// exception
// init some other data.
}
Run Code Online (Sandbox Code Playgroud)

我理解在这个sitiation对象Test中会为null,但可以是对象测试不能为null的情况(删除异常块不能回答:))?

Nat*_*yan 25

如果对其限定符和参数的求值正常完成,并且存在足以创建对象的空间,则类实例创建表达式始终会创建新对象.构造函数是否抛出异常并不重要; 仍然创建了一个对象.但是,在这种情况下,类实例创建表达式不会正常完成,因为它传播了异常.

但是,您仍然可以获取对新对象的引用.考虑以下:

public class C {
    static C obj; // stores a "partially constructed" object
    C() {
        C.obj = this;
        throw new RuntimeException();
    }
    public static void main(String[] args) {
        C obj;
        try {
            obj = new C();
        } catch (RuntimeException e) {
            /* ignore */
        }
        System.out.println(C.obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,在抛出异常之前,对新对象的引用存储在别处.如果运行此程序,您将看到该对象确实不为null,尽管其构造函数未正常完成.

  • 哇,好答案。从未想过像这样构建对象。我知道一个类似的问题,其中子类(重新)实现了一些超类方法,因此可能会暴露部分构造的对象。但是,这种情况下的 C 实例是完全构造的 - 不可能(例如)向类 C 添加 final 字段,将其初始化为字段初始化,但在这种情况下不能初始化该字段。 (2认同)