33 votes

Pourquoi "throw null" ne crée-t-il pas une erreur de compilation en Java ?

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

Nous savons que la règle du lancer est throw ThrowableInstance; donde ThrowableInstance doit être un objet de type Throwable ou une sous-classe de Throwable.

Les types simples, tels que int ou char, ainsi que les classes non throwables, telles que String et Object, ne peuvent pas être utilisés comme exceptions. null est un littéral Java spécial qui représente une valeur nulle.

Alors pourquoi throw null; compiler dans ce code ?

55voto

GargantuChet Points 3169

Selon le spécification du langage , a throw est définie comme suit :

throw Expression

Et si le Expression évalue à null alors a NullPointerException est jeté. Plus précisément,

Si l'évaluation de la Expression se termine normalement, produisant un null alors une instance V' de la classe NullPointerException est créé et lancé à la place de null .

Depuis NullPointerException étend RuntimeException il s'agit d'une exception non vérifiée. Cela pourrait expliquer pourquoi aucune erreur de compilation n'est signalée pour cette construction.

5voto

Peter Lawrey Points 229686

Il y a beaucoup de choses qu'un compilateur ne vérifie pas, il suppose que vous faites des choses pour une bonne raison qu'il peut ne pas connaître. Ce qu'il essaie d'éviter, ce sont les erreurs courantes des développeurs.

Il est possible que quelqu'un pense que c'est une bonne façon de raccourcir pour

throw new NullPointerException();

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

y

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

Imprimés dans la mise à jour 38 de Java 6

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

3voto

sampathpremarathna Points 2080

Je pense que Null peut être transformé en n'importe quel type de référence, donc au moment de la compilation, il n'y a pas de problème si vous lancez null au lieu de throwable.

2voto

En générique, et pas seulement en jet. Toute variable objet peut être assignée null. Nous pouvons donc voir que throw n'est pas un cas spécial. Devrait-il l'être ? Peut-être. Est-il cohérent ? Oui.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X