Ответы:
Вы можете привести null
к любому типу ссылки без каких-либо исключений.
println
Метод не бросает пустой указатель , поскольку он сначала проверяет , является ли объект пустым или нет. Если ноль, то он просто печатает строку "null"
. В противном случае он вызовет toString
метод этого объекта.
Добавление более подробной информации: внутренняя печать методов вызывает String.valueOf(object)
метод для объекта ввода. И в valueOf
методе эта проверка помогает избежать исключения нулевого указателя:
return (obj == null) ? "null" : obj.toString();
Во избежание путаницы, вызов любого метода для нулевого объекта должен вызвать исключение нулевого указателя, если не особый случай.
Вы можете привести null
к любому типу ссылки. Вы также можете вызывать методы, которые обрабатывают null
как аргумент, например, System.out.println(Object)
делает, но вы не можете ссылаться на null
значение и вызывать метод для него.
Кстати, есть сложная ситуация, когда кажется, что вы можете вызывать статические методы для 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
к любому типу ссылки. В противном случае вы не сможете присвоить его ссылочным переменным.
Преобразование значений 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);
В противном случае вы не могли бы вызвать метод, который вам нужен.
String bar = null;
приведение null
значения к String
. До сих пор мне приходилось только явно приводить ноль в тесте, где метод был перегружен, и я хотел проверить его поведение с нулевым вводом. Тем не менее, приятно знать, я собирался написать аналогичный ответ, прежде чем я нашел ваш.
l instanceof Long
и s instanceof String
вернусь false
в этих случаях.
Многие ответы здесь уже упоминают
Вы можете привести null к любому типу ссылки.
и
Если аргумент равен нулю, то строка равна нулю
Я задавался вопросом, где это указано, и посмотрел его в спецификации Java:
Нулевая ссылка всегда может быть назначена или приведена к любому типу ссылки (§5.2, §5.3, §5.5).
Как написали другие, вы можете бросить null на все. Обычно вам это не нужно, вы можете написать:
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 ("Name") возвращает значение null, вы все равно хотите, чтобы описанный выше метод возвращал значение null без исключения. Неважно, что это за класс, ноль - ноль.