Проблема полягає в тому, що 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"
Пов'язані питання
Мораль розповіді
Є кілька важливих:
- Ефективне Java 2-е видання, пункт 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
у цьому випадку), переконайтеся, що обидва перевантаження діють однаково щодо цього значення!