为什么具有null值的String(String)构造函数会导致编译时错误?我认为有2+构造函数接受Object和init。它与null它不知道从哪个开始。我想知道是否还有其他原因
String s = new String(null); // compile time error
StringBuffer sb = new StringBuffer(null); // no error
答案 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[]
,String
,StringBuffer
和StringBuilder
类型之间没有层次结构,所以不可能说一个这些构造函数比其他构造函数更具体。因此,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!