String x = (String) null;
Почему в этом заявлении нет исключения?
String x = null;
System.out.println(x);
Он печатает null
. Но метод .toString()
должен вызывать исключение нулевого указателя.
String x = (String) null;
Почему в этом заявлении нет исключения?
String x = null;
System.out.println(x);
Он печатает null
. Но метод .toString()
должен вызывать исключение нулевого указателя.
Вы можете привести null
к любому ссылочному типу без каких-либо исключений.
Метод println
не выбрасывает нулевой указатель, потому что он сначала проверяет, является ли объект нулевым или нет. Если ноль, то он просто печатает строку "null"
. В противном случае он вызовет метод toString
этого объекта.
Добавление более подробной информации: методы внутренней печати вызывают String.valueOf(object)
для входного объекта. А в методе valueOf
эта проверка помогает избежать исключения нулевого указателя:
return (obj == null) ? "null" : obj.toString();
Во избежание путаницы вызов любого метода для нулевого объекта должен вызвать исключение нулевого указателя, если не особый случай.
Вы можете использовать null
для любого ссылочного типа. Вы также можете вызывать методы, которые обрабатывают null
в качестве аргумента, например. System.out.println(Object)
делает, но вы не можете ссылаться на значение null
и вызывать метод на нем.
BTW Существует сложная ситуация, когда, как представляется, вы можете вызвать статические методы на значения null
.
Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
Это по дизайну. Вы можете использовать null
для любого ссылочного типа. В противном случае вы не сможете присвоить его ссылочным переменным.
Задание нулевых значений требуется для следующей конструкции, где метод перегружен, и если null передается этим перегруженным методам, тогда компилятор не знает, как очистить двусмысленность, поэтому в этих случаях нам нужно указать 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);
В противном случае вы не можете вызвать метод, который вам нужен.
Println(Object)
использует String.valueOf()
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Print(String)
выполняет нулевую проверку.
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
Как написали другие, вы можете наложить нуль на все. Обычно вам это не понадобится, вы можете написать:
String nullString = null;
не помещая при этом бросок.
Но бывают случаи, когда такие отливки имеют смысл:
a), если вы хотите убедиться, что вызван конкретный метод, например:
void foo(String bar) { ... }
void foo(Object bar) { ... }
тогда будет иметь значение, если вы наберете
foo((String) null) vs. foo(null)
b), если вы собираетесь использовать вашу среду IDE для генерации кода; например, я обычно пишу модульные тесты, например:
@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
new MyClassUnderTest((Whatever) null);
}
Я делаю TDD; это означает, что класс "MyClassUnderTest", вероятно, еще не существует. Записав этот код, я могу использовать мою среду IDE для создания нового класса; и затем сгенерировать конструктор, принимающий "любой" аргумент "из коробки" - IDE может определить из моего теста, что конструктор должен принимать ровно один аргумент типа "Независимо".
Распечатайте объект. Строка, созданная методом String.valueOf(Object), преобразуется в байты
если аргумент равен null, тогда строка равна "null"; в противном случае возвращается значение obj.toString().
Он просто возвращает строку со значением "null", когда объект null
.
Это очень удобно при использовании метода, который в противном случае был бы неоднозначным. Например: JDialog имеет конструкторы со следующими сигнатурами:
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
Мне нужно использовать этот конструктор, потому что я хочу установить GraphicsConfiguration, но у меня нет родителя для этого диалога, поэтому первый аргумент должен быть нулевым. Использование
JDialog(null, String, boolean, Graphicsconfiguration)
неоднозначно, поэтому в этом случае я могу сузить вызов, отбросив null до одного из поддерживаемых типов:
JDialog((Frame) null, String, boolean, GraphicsConfiguration)
Многие ответы здесь уже упоминают
Вы можете применить null к любому ссылочному типу
и
Если аргумент равен null, то строка, равная "null"
Я задавался вопросом, где это указано, и посмотрел его на Java Specification:
Если ссылка равна null, она преобразуется в строку "null" (четыре символа ASCII n, u, l, l).
Эта языковая функция удобна в этой ситуации.
public String getName() {
return (String) memberHashMap.get("Name");
}
Если memberHashMap.get("Name") возвращает значение NULL, вы все равно хотите, чтобы приведенный выше метод возвращал значение NULL без исключения. Неважно, что это за класс, ноль - ноль.