Проблема в том, что String.valueOf
метод перегружен :
Язык спецификаций Java предписывает, что в таких случаях выбирается наиболее специфичная перегрузка :
Если более одного метода-члена доступны и применимы для вызова метода, необходимо выбрать один, чтобы предоставить дескриптор для отправки метода во время выполнения.Язык программирования Java использует правило, согласно которому выбирается самый специфический метод.
A char[]
is-an Object
, но не всеObject
is-a char[]
.Следовательно, char[]
является более конкретным , чем Object
, и, как указано языком Java, в этом случае выбирается перегрузка String.valueOf(char[])
.
String.valueOf(char[])
ожидает массивчтобы быть не-null
, и, поскольку в этом случае дается null
, он выдает NullPointerException
.
. Простое "исправление" заключается в явном приведении null
к Object
какследует:
System.out.println(String.valueOf((Object) null));
// prints "null"
Смежные вопросы
Мораль истории
Есть несколько важных:
- Эффективная Java 2ndРедакция, пункт 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"
См. также
Смежные вопросы