具有null值的字符串构造函数

时间:2011-01-26 08:18:50

标签: java string

为什么具有null值的String(String)构造函数会导致编译时错误?我认为有2+构造函数接受Object和init。它与null它不知道从哪个开始。我想知道是否还有其他原因

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


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

4 个答案:

答案 0 :(得分:11)

因为,编译器无法确定要调用的构造函数。 See here它有多少一个参数构造函数。

<强> [编辑] 你说,如果还有其他原因。那么为什么不试试自己呢。做这样的事情,

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.

答案 1 :(得分:10)

通常,当您调用可能适用多个重写版本的构造函数或方法时,Java将选择最具体的构造函数或方法。 Java语言规范的Section 15.12.2详细解释了这一点。

假设您有两个重载方法,如下所示:

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

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

当您致电method(null)时,这两种方法都适用。 Java选择最具体的一个,在这种情况下是第二个方法,需要String - 因为String是比Object更具体的类型。

但是,有时无法确定最具体的构造函数或方法。如果我们看一下带有一个参数的类String的构造函数:

String(byte[] bytes)
String(char[] value)
String(String original)
String(StringBuffer buffer)
String(StringBuilder builder)

请注意,byte[]char[]StringStringBufferStringBuilder类型之间没有层次结构,所以不可能说一个这些构造函数比其他构造函数更具体。因此,Java编译器不知道选择哪个构造函数,并且会给您一个错误。

答案 2 :(得分:2)

只是为解决方案增加更多清晰度:

举个例子:

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);
}

}

它不会抛出任何编译时错误,因为编译器将选择可用相同类型的最具体的构造函数。但是,如果我将课程更改为:

public class Test {
public Test(Long lg){
    System.out.println("Long");
}
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);
}
}

会抛出编译时错误。由于这里涉及两个单独的构造函数层次结构,因此编译器无法做出决定。 一个层次结构是:Object - &gt; String,第二个是Object - &gt; Long,因此无法在Long或String类型构造函数之间进行选择。

答案 3 :(得分:1)

String有许多构造函数。 null可用于他们。

编辑:String在Java 6中有5个单参数构造函数。感谢BoltClock和Adeel Ansari!