2011-07-10 18 views
2

私は太陽がかなり自明だと思います。私は、JDK 1.6.0アップデート26を使用し、これを確認するだけの1行を使用して新しいプロジェクトを作成しました: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

:すべての可能なブールはすでにあなただけできるオートボクシングで、すなわちTRUEとFALSEに定義されているので、別のブールを作成しよう

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クラスには2つのコンストラクタがあり、どちらも1つの引数をとります。 Boolean.class.newInstance()を呼び出すと、存在しないゼロ引数のコンストラクタを呼び出そうとしています。

+0

私は多くのJava、主にC++をしません。これは決して実現しませんでした - Javaでは、存在しない関数を_runtime_エラー、_compile time_エラーではないと言っていますか?魅力的な –

+6

@Kerrekコンストラクタを直接呼び出すコードを記述している場合は、コンパイル時エラーです。この質問には、Java Reflection APIが含まれています。このAPIを使用すると、メソッド、コンストラクタなどを動的に呼び出すことができます。コールターゲットはコンパイル時に認識されないため、唯一のエラーはランタイムエラーです。 –

+0

ありがとう!とても興味深い。 –

0

Booleanクラスには2つの異なるコンストラクタがあります。どちらも1つの議論をとる。そのうちの1つはbooleanですが、もう1つはStringです。 Booleanクラスに渡すときに文字列が空でない場合は、Booleantrueに設定すると認識されます。 nullまたは何も含まない場合は、falseです。あなたはそれを構築する必要があるものを見つけることができますクラスを考えると