2011-07-10 150 views
2

我覺得這個sunject很不言自明。我使用JDK 1.6.0更新26,並創建了一個新的項目只用一行來證實這一點:爲什麼Boolean.class.newInstance()拋出異常?

Boolean.class.newInstance(); 

,並拋出了以下內容:

Exception in thread "main" java.lang.InstantiationException: java.lang.Boolean 
    at java.lang.Class.newInstance0(Class.java:340) 
    at java.lang.Class.newInstance(Class.java:308) 

是否想失敗?如果是這樣,爲什麼?

+0

當然,嘗試創建另一個布爾是沒有意義的,因爲每一個可能的布爾已經被定義,即真假,自動裝箱你可以做'true'或'false' –

回答

1

鑑於你可以找到它需要構建什麼樣的一類:

Class cl = // initialize somehow 
// get all constructors for class 
Constructor[] constructors = cl.getConstructors(); 

// for each constructor 
for(Constructor c : constructors) 
{ 
    // if there is a zero-parameter constructor 
    if(c.getParameterTypes().length == 0) 
    { 
     // then we can safely create a constructor for it 
     cl.newInstance(); 
    } 
} 
21

Boolean類有兩個構造函數,都帶一個參數。調用Boolean.class.newInstance()正嘗試調用不存在的零參數構造函數。

+0

我不會做太多的Java,主要是C++,我從來沒有意識到這一點 - 你是說在Java中調用一個不存在的函數是_runtime_錯誤,而不是_compile time_錯誤?迷人。 –

+6

@Kerrek如果您正在編寫代碼以直接調用構造函數,那麼這是一個編譯時錯誤。這個問題涉及Java Reflection API,它允許您動態調用方法,構造函數等。由於在編譯時不知道調用目標,唯一可能的錯誤是運行時錯誤。 –

+0

謝謝!很有意思。 –

0

Boolean類有兩個不同的構造函數。他們兩人都有一個論點。其中一人需要boolean本身,但其他需要String。如果字符串在傳遞到Boolean類時不是空的,則會將其識別爲將Boolean設置爲true。如果它爲空或不包含任何內容,則它是false

相關問題