簡體   English   中英

在Java中,評估構造函數調用的參數引發異常時會發生什么?

[英]In Java, what happens when evaluating the arguments of a constructor call throws an exception?

考慮下面的Java中的簡單示例。 如果通過調用new B(0)創建對象會怎樣? 首先,在內存中創建類型為B的對象。 然后,表達式1 / n將引發異常。 但是,根據以下Java規范(第12.6.1節),創建的對象將永遠不會完成。 那么我們會發生內存泄漏嗎?

請注意,我並不是在問“構造函數是否可以引發異常”,而是“如果構造函數在特定情況下引發異常會發生什么”。

在對象o的構造函數調用了o上的Object的構造函數並且該調用成功完成(即沒有引發異常)之后,該對象o才能終結。

class A {
    int n;
    A(int n) {
        this.n = n;
    }
}

class B extends A {
    B(int n) { 
        super(1/n);
    }
}

您引用的部分區分可達性和可終結性:

每個對象都可以通過兩個屬性來表征:它可以是可達的,終結器可達的或不可達的,也可以是未終結的,終結的或終結的。

因此,一個對象可以獨立地可到達或不可到達,並且可以終結或不可終結。

在您提到的情況下, Object構造函數從未運行過,因此該對象無法最終確定,但是OTOH構造函數拋出了異常,因此從未發生將new結果分配給變量的情況,因此無法實現。

因此,沒有內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM