49 votes

Valeurs NULL de Strings et Integers en Java

 public class Test {
    public static void main(String[] args) {

        String s = null;
        String s1 = null;
        Integer i = null;
        Integer i1 = null;

        System.out.println(s+i);
        System.out.println(i+s);
        System.out.println(s+s1);

        try {
            System.out.println(i+i1);
        } catch (NullPointerException np) {         
            System.out.print("NullPointerException");       
        }
    }

}
 

La question est simple: pourquoi reçois-je un NullPointerException seulement à la dernière ligne?

60voto

NPE Points 169956

Votre code fait usage de deux différents additifs opérateurs. Les trois premières lignes d'utiliser la concaténation de chaîne, alors que le dernier on utilise addition.

La concaténation de chaîne est bien défini pour activer null en "null":

  • Si la référence est - null, il est converti en chaîne de caractères "null" (quatre caractères ASCII n, u, l, l).

Par conséquent, il n'est pas de NPE.

L'ajout de deux Integer ensemble des objets les oblige à être "unboxed". Il en résulte dans l' null de référence d'être déréférencé, ce qui conduit à la NPE:

  • Si r est null, l'unboxing de conversion jette un NullPointerException

17voto

Tomasz Nurkiewicz Points 140462

Remarquez que les trois premiers + opérateur usages impliquent la concaténation de chaîne. Seul le dernier est le numérique réelle somme. Lors de la concaténation de chaîne (où s variable), un compilateur Java utilise une astuce pour améliorer les performances. Il remplace + opérateur StringBuilder. Par exemple, la première ligne est traduite en:

StringBuilder tmp = new StringBuilder();
tmp.append(s);
tmp.append(i);
System.out.println(tmp);

StringBuilder est null-friendly donc, peu importe ce que vous passez un argument, c'joliment remplace par "null" chaîne de caractères.

La situation est différente dans la dernière ligne. Là, vous faites référence à deux Integer objets. Le seul que la JVM peut faire ici est de unbox (i.intValue()) et faire le calcul. Unboxing de null provoque NullPointerException.

5voto

Nebelmann Points 3455

La concaténation (+ opérateur) de quoi que ce soit avec un String résultats en String. Chaque opérande est d'abord convertie en une Chaîne de caractères (soit à l'aide d' toString(), ou à l'aide de la valeur "null"), ensuite concaténées.

Mais la dernière opération consiste en Integers uniquement, de sorte que les règles précédentes ne s'appliquent pas. Au lieu d'un enchaînement, il ne fait plus. Mais pour ajouter deux Integers, il convertit les objets (Integers) à des valeurs primitives (int), ce qui n'est pas possible si l' Integer a la valeur null. C'est pourquoi vous obtenez une NullPointerException.

1voto

Makoto Points 23751

Semble être un cas d'auto-déballage. Si vous avez deux Integer s first et second , le résultat de leur addition sera first.intValue() + second.intValue() . Étant donné que les deux sont nuls, il en résulte un NPE.

0voto

ziggy Points 4357

Jetez un coup d'œil au bytecode pour votre programme. Vous remarquerez que votre objet null est transmis en tant que paramètre à la méthode PrintStream.print (). Le code source de la méthode print () utilise String.valueOf () comme indiqué ci-dessous:

 public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}
 

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