Відповіді:
Ви можете передавати nullбудь-який тип посилань, не отримуючи винятків.
printlnМетод не кидає порожній покажчик , оскільки він спочатку перевіряє , чи є об'єкт порожнім чи ні. Якщо null, то він просто надрукує рядок "null". Інакше він викличе toStringметод цього об’єкта.
Додавання додаткової інформації:String.valueOf(object) Метод виклику внутрішньо методом друку на вхідному об'єкті. І в valueOfметоді ця перевірка допомагає уникнути нульового виключення вказівника:
return (obj == null) ? "null" : obj.toString();
Для решти вашої плутанини, виклик будь-якого методу на нульовому об'єкті повинен викинути нульовий виняток вказівника, якщо не окремий випадок.
Ви можете nullнадати будь-який тип посилання. Ви також можете викликати методи, які обробляють a nullяк аргумент, наприклад, System.out.println(Object)так, але ви не можете посилатися на nullзначення та викликати метод.
BTW Існує складна ситуація, коли, схоже, ви можете викликати статичні методи на nullзначення.
Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
t.yield() -> Thread.yeld() все одно "оптимізує" його ? Подібно до того, як final int i = 1; while (i == 1)оптимізовано доwhile(true)
Це за дизайном. Ви можете nullнадати будь-який тип посилання. Інакше ви не зможете призначити його посилальним змінним.
Кастинг нульових значень потрібен для наступної конструкції, коли метод перевантажений, і якщо нуль передається цим перевантаженим методам, тоді компілятор не знає, як усунути неоднозначність, отже, нам потрібно набрати нуль у цих випадках:
class A {
public void foo(Long l) {
// do something with l
}
public void foo(String s) {
// do something with s
}
}
new A().foo((String)null);
new A().foo((Long)null);
Інакше ви не зможете викликати потрібний вам метод.
String bar = null;передає nullзначення String. Поки що мені довелося явно наводити null в тесті, де метод був перевантажений, і я хотів перевірити його поведінку з введенням null. І все-таки, добре знати, я збирався написати подібну відповідь, перш ніж знайшов вашу.
l instanceof Longі s instanceof Stringповернеться falseв цих випадках.
Багато відповідей тут уже згадуються
Ви можете привести нуль до будь-якого типу посилань
і
Якщо аргумент є нульовим, то рядок, рівний "null"
Я цікавився, де це вказано, і подивився його на специфікацію Java:
Якщо посилання є нульовим, воно перетворюється на рядок "null" (чотири ASCII символи n, u, l, l).
Як написали інші, ви можете припустити нуль до всього. Зазвичай вам це не потрібно, ви можете написати:
String nullString = null;
не ставлячи туди ролі.
Але бувають випадки, коли такі ролі мають сенс:
а) якщо ви хочете переконатися, що викликається певний метод, наприклад:
void foo(String bar) { ... }
void foo(Object bar) { ... }
то це змінило б значення, якщо ви наберете
foo((String) null) vs. foo(null)
б) якщо ви плануєте використовувати свій IDE для створення коду; наприклад, я зазвичай пишу одиничні тести, такі як:
@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
new MyClassUnderTest((Whatever) null);
}
Я роблю TDD; це означає, що клас "MyClassUnderTest", ймовірно, ще не існує. Записавши цей код, я можу потім використовувати свій IDE, щоб спочатку генерувати новий клас; а потім генерувати конструктор, який приймає аргумент "Що б не було", - IDE може зрозуміти з мого тесту, що конструктор повинен приймати рівно один аргумент типу "Що б не було".
Це дуже зручно при використанні методу, який інакше був би неоднозначним. Наприклад: JDialog має конструктори з такими підписами:
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
Мені потрібно використовувати цей конструктор, тому що я хочу встановити GraphicsConfiguration, але у мене немає батьків для цього діалогового вікна, тому перший аргумент повинен бути нульовим. Використання
JDialog(null, String, boolean, Graphicsconfiguration)
є неоднозначним, тому в цьому випадку я можу звузити виклик, передавши null до одного з підтримуваних типів:
JDialog((Frame) null, String, boolean, GraphicsConfiguration)
Ця мовна функція зручна в цій ситуації.
public String getName() {
return (String) memberHashMap.get("Name");
}
Якщо memberHashMap.get ("Ім'я") повертає null, ви все одно хочете, щоб метод, наведений вище, повернув null, не викидаючи виняток. Незалежно від класу, null є null.