让我从一个失败的对象构造场景开始,它可以举例说明如果您可以使用此类失败的对象,可能会出现什么问题:
让我们定义一个类 A,这样:
class A {
private String a = "A";
public A() throws Exception {
throw new Exception();
}
}
现在,假设我们想在 a 中创建一个 A 类型的对象try...catch
block.
A a = null;
try{
a = new A();
}catch(Exception e) {
//...
}
System.out.println(a);
显然,这段代码的输出将是:null
.
为什么 Java 不返回 A 的部分构造版本?毕竟,此时构造函数失败了name
字段成员已经被初始化了,对吗?
Java 不会这样做,因为对象没有成功构建。该对象处于不一致状态,因此被 Java 丢弃。您的变量 A 甚至没有初始化,它保持为 null。
现在,如您所知,要完全构建一个新对象,必须首先初始化其所有超类。如果其中一个超类未能构建,该对象的最终状态是什么?这是不可能确定的。
看看这个更详细的例子
class A {
private final int a;
public A() throws Exception {
a = 10;
}
}
class B extends A {
private final int b;
public B() throws Exception {
methodThatThrowsException();
b = 20;
}
}
class C extends B {
public C() throws Exception { super(); }
}
当构造函数C
如果初始化时发生异常,则调用B
,最终变量的值是多少int b
?
因此,对象 C 无法被创建,它是假的,它是垃圾,它没有完全初始化。