在Java中,在评估构造函数调用的参数时会发生什么会引发异常?

时间:2016-03-05 17:06:47

标签: java

考虑下面Java中的简单示例。如果我通过调用 ref.on("value", function(element) { return function (snapshot) { element.innerHTML = snapshot.val(); console.log(element); } }(elements[i]), function (errorObject) { // Deal with errors console.log("The read failed: " + errorObject.code); }); 创建对象会发生什么?首先,在内存中创建一个B类对象。然后,表达式1 / n将抛出异常。但是根据下面的Java规范(第12.6.1节),创建的对象永远不会被最终确定。那么我们是否会发生内存泄漏?

请注意,我不是在问“构造函数是否可以抛出异常”,而是“如果构造函数在特定情况下抛出异常会发生什么。”

  

对象o在其构造函数调用了o上的Object的构造函数并且该调用已成功完成(即不抛出异常)之前无法终结。

new B(0)

1 个答案:

答案 0 :(得分:4)

您引用的部分区分了可达性和可终结性:

  

每个对象都可以通过两个属性来表征:它可以是可达的,终结器可达的,或者是不可达的,它也可以是未终结的,可终结的或最终的。

因此,一个对象可以独立访问,也可以无法访问,并且可以终结或不可终结。

在你提到的情况下,Object构造函数从未运行过,因此对象不可终结,但是构造函数的OTOH抛出异常,因此将new结果赋值给变量永远不会发生,所以它无法到达。

所以没有内存泄漏。