Відповіді:
Ви можете передавати 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.