请考虑以下Java中的简单示例。通过调用new B(0)
创建对象会发生什么?首先,在内存中创建一个类型为B的对象。然后,表达式1/n将抛出异常。但是,根据下面的Java规范(第12.6.1节),创建的对象将永远不会完成。那么我们是否会发生内存泄漏?在Java中,评估构造函数调用的参数时会发生什么情况会引发异常?
请注意,我不是问“构造函数是否可以抛出异常”,而是“如果构造函数在特定情况下抛出异常,会发生什么。”
对象o直到它的构造函数调用了o上的Object的构造函数并且该调用已成功完成(即,没有引发异常)才能被终结。
class A {
int n;
A(int n) {
this.n = n;
}
}
class B extends A {
B(int n) {
super(1/n);
}
}
我认为“可定制的”指的是在对象被GCed时调用'finalize()',而不是*该对象是否会被GCed。 –
可能的重复[可以构造函数在Java中引发异常?](http://stackoverflow.com/questions/1371369/can-constructors-throw-exceptions-in-java) – mawalker
@DavidEhrmann正确。一个对象是否可以终结是很无关紧要的,因为几乎没有你应该使用终结器的场景。 – biziclop