Нет исключения при тике cast с нулевым значением в java

String x = (String) null;

Почему в этом заявлении нет исключения?

String x = null;
System.out.println(x);

Он печатает null. Но метод .toString() должен вызывать исключение нулевого указателя.

+182
10 сент. '13 в 15:53
источник поделиться
10 ответов

Вы можете привести null к любому ссылочному типу без каких-либо исключений.

Метод println не выбрасывает нулевой указатель, потому что он сначала проверяет, является ли объект нулевым или нет. Если ноль, то он просто печатает строку "null". В противном случае он вызовет метод toString этого объекта.

Добавление более подробной информации: методы внутренней печати вызывают String.valueOf(object) для входного объекта. А в методе valueOf эта проверка помогает избежать исключения нулевого указателя:

return (obj == null) ? "null" : obj.toString();

Во избежание путаницы вызов любого метода для нулевого объекта должен вызвать исключение нулевого указателя, если не особый случай.

+262
10 сент. '13 в 15:57
источник

Связанные вопросы


Похожие вопросы

Вы можете использовать null для любого ссылочного типа. Вы также можете вызывать методы, которые обрабатывают null в качестве аргумента, например. System.out.println(Object) делает, но вы не можете ссылаться на значение null и вызывать метод на нем.

BTW Существует сложная ситуация, когда, как представляется, вы можете вызвать статические методы на значения null.

Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
+131
10 сент. '13 в 15:58
источник

Это по дизайну. Вы можете использовать null для любого ссылочного типа. В противном случае вы не сможете присвоить его ссылочным переменным.

+32
10 сент. '13 в 15:57
источник

Задание нулевых значений требуется для следующей конструкции, где метод перегружен, и если 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);

В противном случае вы не можете вызвать метод, который вам нужен.

+13
23 янв. '15 в 19:16
источник

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);
}
+4
10 сент. '13 в 15:56
источник

Как написали другие, вы можете наложить нуль на все. Обычно вам это не понадобится, вы можете написать:

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 может определить из моего теста, что конструктор должен принимать ровно один аргумент типа "Независимо".

+3
13 апр. '16 в 8:01
источник

Print:

Распечатайте объект. Строка, созданная методом String.valueOf(Object), преобразуется в байты

ValueOf:

если аргумент равен null, тогда строка равна "null"; в противном случае возвращается значение obj.toString().

Он просто возвращает строку со значением "null", когда объект null.

+2
10 сент. '13 в 15:57
источник

Это очень удобно при использовании метода, который в противном случае был бы неоднозначным. Например: JDialog имеет конструкторы со следующими сигнатурами:

JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)

Мне нужно использовать этот конструктор, потому что я хочу установить GraphicsConfiguration, но у меня нет родителя для этого диалога, поэтому первый аргумент должен быть нулевым. Использование

JDialog(null, String, boolean, Graphicsconfiguration) 

неоднозначно, поэтому в этом случае я могу сузить вызов, отбросив null до одного из поддерживаемых типов:

JDialog((Frame) null, String, boolean, GraphicsConfiguration)
+2
23 июл. '15 в 7:22
источник

Многие ответы здесь уже упоминают

Вы можете применить null к любому ссылочному типу

и

Если аргумент равен null, то строка, равная "null"

Я задавался вопросом, где это указано, и посмотрел его на Java Specification:

Нулевая ссылка всегда может быть назначена или применена к любому ссылочному типу (§5.2, §5.3, §5.5).

Если ссылка равна null, она преобразуется в строку "null" (четыре символа ASCII n, u, l, l).

+2
17 авг. '17 в 9:19
источник

Эта языковая функция удобна в этой ситуации.

public String getName() {
  return (String) memberHashMap.get("Name");
}

Если memberHashMap.get("Name") возвращает значение NULL, вы все равно хотите, чтобы приведенный выше метод возвращал значение NULL без исключения. Неважно, что это за класс, ноль - ноль.

0
01 февр. '19 в 1:02
источник

Посмотрите другие вопросы по меткам или Задайте вопрос