[英]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
。
從文檔:
Error
是Throwable
的子類,表示合理的應用程序不應該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.