你能否告诉我,当构造函数抛出异常且对象不为null时,可能会出现这种情况。我的意思是对象的某些部分被创建,而另一部分则没有。就像这个
public Test(){
name = "John";
// exception
// init some other data.
}
我理解在这个sitiation对象中测试将为null,但可以是对象测试不能为null的情况(删除异常块不能回答:))?
答案 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
}
}
上述代码根据您的期望而有意义。