Проблема в том, что 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
в этом случае), убедитесь, что обе перегрузки действуют одинаково в отношении этого значения!