2011-01-26 13 views
8

null値を指定したString(String)コンストラクタがコンパイル時エラーを発生させる理由を教えてください。私はObjectとinitをとるコンストラクタが2つあると思います。それはnullで始まるものが分からない。別の理由があるかどうか疑問に思っています。null値を持つ文字列コンストラクタ

String s = new String(null); // compile time error 


StringBuffer sb = new StringBuffer(null); // no error 
+0

実行しようとすると、 'StringBuffer'の' NullPointerException'を取得する必要があります(もちろん、それはポイントの横です)。 – BoltClock

+1

http:// stackoverflowを見てください。com/questions/1545501/which-overload-will-get-selected-for-null-in-java – pingw33n

答えて

11

コンパイラはどのコンストラクタを呼び出すべきか分からなかったので、私は思っています。 See hereには、1つの引数を持つコンストラクタがいくつあるかを示します。

[編集] あなたには、別の理由があると言われました。だから自分自身を試してみませんか?

byte[] b = null; 
String s = new String(b); // complier should be fine with this 

char[] c = null; 
String s = new String(c); // complier should be fine with this 

.... // you can try other constructors using similar approach. 
+0

私はそうだと思いますが、別の理由があるのだろうかと思います。私は今質問を編集中です –

+0

@hilal:私の補遺を見てください。 –

+0

+1。良い答え –

1

文字列は、多くコンストラクタがあり、このような何かを行います。それらにはnullを使用できます。

編集:文字列にはJavaの6つの引数を持つコンストラクタが5つあります。おかげでBoltClockとAdeel Ansari!

+1

それは2つ以上のコンストラクタを持っています。 – BoltClock

+1

文字列はJavaで1つの引数を持つコンストラクタを5つ持っています。 –

7

通常、複数のオーバーライドされたバージョンが適用されるコンストラクタまたはメソッドを呼び出すと、Javaは最も具体的なコンストラクタまたはメソッドを選択します。 Java言語仕様書のSection 15.12.2はこれを詳細に説明している。あなたはこれらの方法が適用され、両方の、method(null)を呼び出すと

public void method(Object o) { 
    // ... 
} 

public void method(String s) { 
    // ... 
} 

は、あなたがこのような2つのオーバーロードされたメソッドを、持っていると仮定します。 Javaは最も具体的なものを選択します。この場合は2番目の方法ですが、StringObjectよりも具体的なタイプなので、Stringが必要です。

ただし、最も具体的なコンストラクタまたはメソッドを特定できないことがあります。私たちは一つの引数を取るクラスStringのコンストラクタを見れば:

そこ種類 byte[]char[]StringStringBufferStringBuilderの間には階層がありませんので、それはこれらの1つを言うことができないということ
String(byte[] bytes) 
String(char[] value) 
String(String original) 
String(StringBuffer buffer) 
String(StringBuilder builder) 

注意コンストラクタは他よりも具体的です。したがって、Javaコンパイラはどのコンストラクタを選択するのかわからず、エラーが発生します。ただ、解決に多くの明快さを追加する

+0

と非常に明確な答え – Humoyun

1

この例を見てみましょう:

public class Test { 
public Test(Object obj) { 
    System.out.println("Object"); 
} 
public Test(String obj) { 
    System.out.println("String"); 
} 
public static void main(String[] args) { 
    new Test(null); 
} 

} 

それはコンパイラとして任意のコンパイル時にエラーがスローされませんが利用できる同じ種類の最も具体的なコンストラクタを選択します。ただし、クラスを次のように変更した場合:

コンパイル時にエラーが発生します。 2つの別々のコンストラクタ階層がここに関わっているので、コンパイラは決定を下す方法がありません。 1つの階層は:Object - > Stringで、2番目はObject - > Longなので、LongまたはString型のコンストラクタを選択する方法はありません。

関連する問題