Почему «throw null» не создает ошибку компиляции в Java? - PullRequest
31 голосов
/ 06 июля 2011
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; компилируется в этом коде?

Ответы [ 4 ]

55 голосов
/ 06 июля 2011

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

throw Expression

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

Если вычисление Выражения завершается нормально, производя значение null, то создается экземпляр V ' класса NullPointerException, который выдается вместо null.

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

5 голосов
/ 06 июля 2011

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

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

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 голосов
/ 06 июля 2011

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

2 голосов
/ 06 июля 2011

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

...