Проблема в том, что String.valueOf
метод перегружен :
Язык спецификаций Java требует, чтобы в таких случаях выбиралась наиболее конкретная перегрузка :
Если более одного метода-члена доступны и применимы к вызову метода, необходимо выбрать один, чтобы предоставить дескриптор для отправки метода времени выполнения. В языке программирования Java используется правило, согласно которому выбирается наиболее конкретный метод.
char[]
Это-ан Object
, но не все Object
это-а char[]
. Таким образом, char[]
является более точным , чем Object
, и , как указано на языке Java, то String.valueOf(char[])
перегрузка выбирается в этом случае.
String.valueOf(char[])
ожидает, что массив не будет null
, и, поскольку null
в этом случае задан, он выбрасывает NullPointerException
.
Простое «исправление» - это null
явно привести к Object
следующему:
System.out.println(String.valueOf((Object) null));
// prints "null"
Связанные вопросы
Мораль истории
Вот несколько важных:
- Эффективное 2-е издание Java, пункт 41: разумно используйте перегрузку
- То, что вы можете перегрузить, не означает, что вам следует каждый раз
- Они могут вызвать путаницу (особенно если методы делают совершенно разные вещи).
- Используя хорошую IDE, вы можете проверить, какая перегрузка выбрана во время компиляции.
- С Eclipse, вы можете мыши при наведении курсора на приведенном выше выражении , и видим , что на самом деле , то
valueOf(char[])
выбирается перегрузка!
- Иногда вы хотите явно использовать приведение
null
(примеры для подражания)
Смотрите также
На кастинге null
Существует как минимум две ситуации, когда необходимо явное приведение null
к конкретному ссылочному типу:
- Чтобы выбрать перегрузку (как показано в примере выше)
- Чтобы передать
null
в качестве единственного аргумента параметр vararg
Простой пример последнего:
static void vararg(Object... os) {
System.out.println(os.length);
}
Тогда у нас может быть следующее:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Смотрите также
Связанные вопросы
null
в этом случае), убедитесь, что обе перегрузки действуют одинаково в отношении этого значения!String.valueOf(Object)
и вvalueOf(char[])
любом случае (независимо от тогоnull
или нет), они, возможно, не должны были быть перегрузками.return null;
будет точно таким же, какreturn (Object) null;
?Проблема в том, что ты звонишь,
String.valueOf(char[])
а нетString.valueOf(Object)
.Причина этого в том, что Java всегда будет выбирать наиболее конкретную версию перегруженного метода, которая работает с предоставленными параметрами.
null
- допустимое значение дляObject
параметра, но это также допустимое значение дляchar[]
параметра.Чтобы заставить Java использовать
Object
версию, либо перейдитеnull
через переменную, либо укажите явное приведение к Object:источник
Ошибка под номером 4867608 была зарегистрирована для этого способа еще в 2003 году, которая была решена как «не исправить» с этим объяснением.
источник
Используйте
String.valueOf(null: Any)
в Scala.источник