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