53 votes

Quelle est la différence entre "(Object) null" et "null" en Java?

Regardez l'exemple suivant:

 class nul
{
  public static void main (String[] args)
  {
    System.out.println (String.valueOf((Object)null));
    System.out.println (String.valueOf(null));
  }
}
 

Le premier println écrit null mais le second jette un NullPointerException .

Pourquoi seule la deuxième ligne mérite une exception? Et quelle est la différence entre les deux null s? Existe-t-il un réel null et un faux null en Java?

56voto

Rohit Jain Points 90368

Première invocation appellera String.valueOf(Object) méthode, comme vous l'avez explicitement typecasted null de Object de référence. Tandis que le 2ème on appelle la surcharge String.valueOf(char[]) méthode char[] plus spécifiques à l' Object d'un null argument.

Il y a d'autres versions surchargées de cette méthode, qui prennent les types primitifs, mais ne sont pas valides match pour null argument.

De JLS §15.12.2:

Il peut y avoir plus d'une telle méthode, auquel cas les plus spécifique est choisi. Le descripteur (signature plus le type de retour) de le plus spécifique de la méthode est celle utilisée au moment de l'exécution pour exécuter la méthode de l'expédition.

Une méthode est applicable si elle est applicable par sous-typage (§15.12.2.2), applicable par l'invocation de méthode de conversion (§15.12.2.3), ou c'est une variable arity (§15.12.2.4).

[...]

Si plusieurs méthodes ont été identifiés au cours de l'une des trois phases de l'applicabilité de test, puis le plus spécifique est choisi, comme spécifié dans la section §15.12.2.5.

Maintenant, vérifiez le code source des deux méthodes:

// This won't throw NPE for `obj == null`
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

// This will throw `NPE` for `data == null`
public static String valueOf(char data[]) {
    return new String(data);
}

16voto

Boris the Spider Points 20200

Il y a beaucoup de surchargés String.valueOf méthodes en Java. De plus, en Java, null a toute et tous les types de sorte que quoi que ce soit (ce n'est pas une primitive) peuvent être null.

Ainsi, lorsque vous appelez (String.valueOf((Object)null) vous appelez l' valueOf méthode qui prend un Object que de l'utilisation de convertir explicitement null de Object.

Dans le deuxième exemple, vous ne sont pas explicitement exprimés l' null d'un type particulier donc, en fait, vous appelez l' valueOf méthode de char[] qui jette un NPE.

À partir de la JLS §15.12.2

La deuxième étape des recherches du type déterminé dans l'étape précédente pour membre des méthodes. Cette étape utilise le nom de la méthode et les types de l'argument des expressions pour localiser des méthodes qui sont à la fois accessibles et applicable, qui est, les déclarations qui peuvent être correctement appelé sur les arguments donnés.

Il peut y avoir plus d'une telle méthode, auquel cas les plus spécifique est choisi. Le descripteur (signature plus le type de retour) de le plus spécifique de la méthode est celle utilisée au moment de l'exécution pour exécuter la méthode de l'expédition.

Dans ce cas - char[] est plus spécifique que l' Object il est appelé lorsque aucun cast explicite de l' null est faite.

6voto

ceving Points 3990

Bien que j'ai accepté déjà de la réponse, je voudrais ajouter la réponse exacte à la question, parce que les deux réponses se concentrer sur l'explication de la le piège, je suis entré dans.

La différence entre (Object)null et null , c'est que le type de la première est forcé d' Object mais le type de la seconde ne l'est pas, comme on pourrait le penser, contraint à l' Object. Au lieu de cela, il pourrait aussi être un tableau au lieu d'un objet.

Donc la conclusion est: pass (Object)null au lieu de null comme argument à une méthode pour être sûr d'obtenir exactement la méthode de travail sur les objets au lieu de toute autre méthode de travail sur les tableaux.

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