Почему "throw null" не создает ошибку компиляции в Java?

class ThrowNull {
    public static void main(String[] args) {
        throw null;
    }
}

Мы знаем, что правило для throw throw ThrowableInstance;, где ThrowableInstance должно быть объектом типа Throwable или подкласса Throwable.

Простые типы, такие как int или char, а также не-Throwable классы, такие как String и Object, не могут использоваться в качестве исключений. null - это специальный литерал Java, который представляет собой нулевое значение.

Так зачем компилировать throw null; в этот код?

Ответ 1

В соответствии с спецификацией языка, оператор throw определяется как:

throw Expression

И если Expression оценивается как null, то бросается a NullPointerException. В частности,

Если оценка Expression завершается нормально, создавая значение null, тогда создается экземпляр V 'класса NullPointerException и вместо null.

Так как NullPointerException extends RuntimeException, это неконтролируемое исключение. Это может объяснить, почему в этой конструкции отсутствует ошибка времени компиляции.

Ответ 2

Есть много вещей, которые компилятор не проверяет, он предполагает, что вы делаете что-то по хорошей причине, о которой он может не знать. То, что он пытается предотвратить, - это распространенные ошибки разработчиков.

Возможно, кто-то подумает, что это хорошая короткая рука для

throw new NullPointerException();

Integer i = null;
try {
    i.intValue();
} catch (NullPointerException npe) {
    System.err.println("Caught NPE");
    npe.printStackTrace();
}

и

try {
    throw null;
} catch (NullPointerException npe) {
    System.err.println("Caught NPE");
    npe.printStackTrace();
}

печатает в обновлении Java 6 38

Caught NPE
java.lang.NullPointerException
    at Main.main(Main.java:9)

Ответ 3

Я думаю, потому что Null может быть применен к любому типу reference.so во время компиляции ничего не случилось, если вы выбрали null вместо throwable.

Ответ 4

В генерале, а не просто бросать. Любую объектную переменную можно присвоить значение null. Таким образом, мы видим, что бросок не является особым случаем. Должно быть? может быть. Это непротиворечиво? Да.