Pourquoi un pointeur nul au lieu d'un cast de classe?


26

En Java:

int count = (Integer) null;

lève une exception java.lang.NullPointerException.

Pourquoi cela ne déclenche-t-il pas une exception de classe Cast pour faciliter la compréhension du programmeur?

Pourquoi cette exception a-t-elle été choisie par rapport à toute autre exception?

Réponses:


46

Lors de l'exécution de votre code, le runtime Java effectue les opérations suivantes:

  1. Cast null à un objet de classe Integer.
  2. Essayez de décompresser l'objet Integer dans un int en appelant la méthode intValue ()
  3. L'appel d'une méthode sur un objet nul lève une exception NullPointerException.

En d'autres termes, null peut être converti en entier sans problème, mais un objet entier nul ne peut pas être converti en une valeur de type int.

MODIFIER

J'avais une question connexe il y a quelque temps chez Stack Overflow, voir ici .


1

Java convertit avec succès null en une référence entière qui ne fait référence à aucun objet.

C'est OK car le fait de ne pas être différencié est un état valide pour une référence.

C'est l'appel d'une méthode d'un objet non existant qui ne peut pas être effectuée.

L'exécution de la conversion (Integer)nulléquivaut à déclarer une variable Integer et à ne pas lui affecter une nouvelle instance d'objet Integer (ou déjà existante).


-1

Pour déballer un Integerdans un intie dans int i = new Integer(15);, est en ifait égal à new Integer(15).intValue() i = (Integer) o; où Object o = 15est le même que o = Integer.valueOf(15);mais i = null; jette un NullPointerExceptioncar ialors égal à null.intValue()qui jette un NullPointerException.


2
La réponse qui a été acceptée il y a près de deux ans fournit presque la même explication, mais est plus claire. Cette réponse n'est pas non plus correcte pour Java 5+: il utilise désormais les valueOf()méthodes d'usine plutôt que de créer de nouvelles instances pour la boxe.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.