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

时间:2011-05-06 10:04:39

标签: java exception constructor logic

你能否告诉我,当构造函数抛出异常且对象不为null时,可能会出现这种情况。我的意思是对象的某些部分被创建,而另一部分则没有。就像这个

public Test(){
name = "John";
// exception
// init some other data.
}

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

4 个答案:

答案 0 :(得分:24)

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

但是,您仍然可以获得对新对象的引用。请考虑以下事项:

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);
    }
}

这里,在抛出异常之前,对新对象的引用存储在别处。如果你运行这个程序,你会看到该对象确实不是null,虽然它的构造函数没有正常完成。

答案 1 :(得分:4)

没有。查看客户端代码:

Test myObj = null;
try {
 myObj = new Test();
} catch(MyException e) {
  System.out.println("" + myObj);
}

这里,当发生异常时,不执行'='操作。您的代码直接进入catch块,myObj保持null

答案 2 :(得分:2)

没有。如果在对象实例化期间发生异常,则不会创建它。

无论如何,你会写吗?

MyObject obj = new MyObject();
// This code will not be reachable in case of an Exception

或:

MyObject obj = null;
try {
    obj = new MyObject();
} catch (AnyException e) {
}
// Here, either obj is created correctly, or is null as an Exception occurred.

答案 3 :(得分:-1)

 public Test()
{  
name = "John"; 

     try{
 // exception 

// init some other data. 
}catch(AnyException e)
{
//catch
}


 }

上述代码根据您的期望而有意义。