Нет исключения при тике cast с нулевым значением в java
String x = (String) null;
Почему в этом заявлении нет исключения?
String x = null;
System.out.println(x);
Он печатает null
. Но метод .toString()
должен вызывать исключение нулевого указателя.
Ответы
Ответ 1
Вы можете привести null
к любому ссылочному типу без каких-либо исключений.
Метод println
не выбрасывает нулевой указатель, потому что он сначала проверяет, является ли объект нулевым или нет. Если ноль, то он просто печатает строку "null"
. В противном случае он вызовет метод toString
этого объекта.
Добавление более подробной информации: методы внутренней печати вызывают String.valueOf(object)
для входного объекта. А в методе valueOf
эта проверка помогает избежать исключения нулевого указателя:
return (obj == null) ? "null" : obj.toString();
Во избежание путаницы вызов любого метода для нулевого объекта должен вызвать исключение нулевого указателя, если не особый случай.
Ответ 2
Вы можете использовать null
для любого ссылочного типа. Вы также можете вызывать методы, которые обрабатывают null
в качестве аргумента, например. System.out.println(Object)
делает, но вы не можете ссылаться на значение null
и вызывать метод на нем.
BTW Существует сложная ситуация, когда, как представляется, вы можете вызвать статические методы на значения null
.
Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
Ответ 3
Это по дизайну. Вы можете использовать null
для любого ссылочного типа. В противном случае вы не сможете присвоить его ссылочным переменным.
Ответ 4
Задание нулевых значений требуется для следующей конструкции, где метод перегружен, и если 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);
В противном случае вы не можете вызвать метод, который вам нужен.
Ответ 5
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);
}
Ответ 6
Как написали другие, вы можете наложить нуль на все.
Обычно вам это не понадобится, вы можете написать:
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 может определить из моего теста, что конструктор должен принимать ровно один аргумент типа "Независимо".
Ответ 7
Print:
Распечатайте объект. Строка, созданная методом String.valueOf(Object), преобразуется в байты
ValueOf:
если аргумент равен null, тогда строка равна "null"; в противном случае возвращается значение obj.toString().
Он просто возвращает строку со значением "null", когда объект null
.
Ответ 8
Это очень удобно при использовании метода, который в противном случае был бы неоднозначным. Например: JDialog имеет конструкторы со следующими сигнатурами:
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
Мне нужно использовать этот конструктор, потому что я хочу установить GraphicsConfiguration, но у меня нет родителя для этого диалога, поэтому первый аргумент должен быть нулевым. Использование
JDialog(null, String, boolean, Graphicsconfiguration)
неоднозначно, поэтому в этом случае я могу сузить вызов, отбросив null до одного из поддерживаемых типов:
JDialog((Frame) null, String, boolean, GraphicsConfiguration)
Ответ 9
Многие ответы здесь уже упоминают
Вы можете применить null к любому ссылочному типу
и
Если аргумент равен null, то строка, равная "null"
Я задавался вопросом, где это указано, и посмотрел его на Java Specification:
Нулевая ссылка всегда может быть назначена или применена к любому ссылочному типу (§5.2, §5.3, §5.5).
Если ссылка равна null, она преобразуется в строку "null" (четыре символа ASCII n, u, l, l).
Ответ 10
Эта языковая функция удобна в этой ситуации.
public String getName() {
return (String) memberHashMap.get("Name");
}
Если memberHashMap.get("Name") возвращает значение NULL, вы все равно хотите, чтобы приведенный выше метод возвращал значение NULL без исключения. Неважно, что это за класс, ноль - ноль.