簡體   English   中英

在Java中,當對象無法實例化時會發生什么?

[英]In Java what happens when an object fails to be instantiated?

我來自c ++背景,我發現自己經常在java中這樣做:

SomeClass sc=new SomeClass();

if(null!=sc)
{
    sc.doSomething();
}

我想知道的是,如果構造函數由於某種原因(例如可能沒有足夠的內存)而失敗,那么變量sc中會出現什么。 我找不到一個直接的答案,我擔心我只是在浪費時間,因為如果新的操作員失敗,程序會崩潰嗎?

Java規范語言第3版徹底涵蓋了您的問題:

12.5創建新的類實例

每當創建一個新的類實例時,就會為它分配內存空間,為類類型中聲明的所有實例變量提供空間,並在類類型的每個超類中聲明所有實例變量,包括可能隱藏的所有實例變量。 如果沒有足夠的可用空間來為對象分配內存,則使用OutOfMemoryError突然完成類實例的創建。 否則,新對象中的所有實例變量(包括在超類中聲明的那些變量)都將初始化為其默認值。

在作為結果返回對新創建的對象的引用之前,處理指示的構造函數以使用以下過程初始化新對象:[...]

因此, new表達式根本不可能返回null 無論返回什么,如果執行正常完成,將始終是實例化任何類的有效instanceof


處理異常

一般來說,可能的異常通常使用try-catch塊處理:

String someString = askFromUser();
try {
   int num = Integer.parseInt(someString);
   doSomethingWith(num);
} catch (NumberFormatException e) {
   complainAboutIt();
}

在您的情況下,您可以考慮將new SomeClass()放在帶有相應catch (OutOfMemoryError e)try塊中,但這非常不典型。 除非您計划在發生這種情況時執行某些有意義的操作,否則在大多數典型情況下,最好不要catch程序執行期間可能發生的任何Error

從文檔:

ErrorThrowable的子類,表示合理的應用程序不應該try catch嚴重問題。 大多數此類錯誤都是異常情況。

一個方法不需要在其throws子句中聲明在執行方法期間可能拋出但未捕獲的任何Error類,因為這些錯誤是永遠不應發生的異常情況。

相關問題

也可以看看

如果構造函數失敗,那么它會拋出異常或錯誤,你不會在程序中得到任何進一步的結果。 具體來說,如果內存不足,則會出現OutOfMemoryError

是的,你在浪費你的時間:-)。 調用構造函數后,sc保證為非null。 如果構造函數失敗,則拋出異常並且永遠不會運行以下代碼。 因此以下在Java中是安全的:

SomeClass sc = new SomeClass();
sc.doSomething();

不拋出NullPointerException。

if不需要檢查,一些IDE甚至會抱怨它是不必要的,因為它總是評估為true new失敗的唯一原因是構造函數拋出異常,在這種情況下,無論如何都會繞過if檢查。

SomeClass sc=new SomeClass();

if(null!=sc) { sc.doSomething(); }

創建對象后,對象引用永遠不會為null ,因此無需進行空檢查,因為條件始終為true。

例如,如果構造函數中的內存不足,則會OutOfMemoryError ,構造函數將無法正常返回。

拋出OutOfMemoryError ,通常會使虛擬機崩潰。 (可能被視為Throwable)

您可能會發現Java OutOfMemory Error中的Prevent和Recover很有用。

暫無
暫無

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

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