Строковый конструктор с нулевым значением - PullRequest
9 голосов
/ 26 января 2011

почему конструктор String (String) с нулевым значением вызывает ошибку во время компиляции? Я думаю, что есть 2+ конструктор, который принимает объект и при инициализации. это с нуля, он не знает, с чего начать. Интересно, есть ли другая причина

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


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

Ответы [ 4 ]

11 голосов
/ 26 января 2011

Потому что компилятор не может определить, какой конструктор вызывать. Смотрите здесь , сколько у него одного аргумента-конструктора.

[Отредактировано] Вы сказали, если есть другая причина.Так почему бы не попробовать себя.Сделай что-то вроде этого,

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.
10 голосов
/ 26 января 2011

Обычно, когда вы вызываете конструктор или метод, для которого могут применяться несколько переопределенных версий, Java выберет наиболее конкретный конструктор или метод. Раздел 15.12.2 Спецификации языка Java объясняет это подробно.

Предположим, у вас есть два перегруженных метода, например:

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 голосов
/ 29 мая 2015

Просто для большей ясности в решении:

Возьмите этот пример:

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 -> String, а вторая - Object -> Long, поэтому нет никакого выбора между конструкторами типа Long или String.

1 голос
/ 26 января 2011

Строка имеет много конструкторов.для них доступен null.

Редактировать: String имеет 5 конструкторов с одним аргументом в Java 6. Спасибо BoltClock и Адел Ансари!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...