Почему "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. Таким образом, мы видим, что бросок не является особым случаем. Должно быть? может быть. Это непротиворечиво? Да.