web-dev-qa-db-fra.com

Java null Chaîne égale résultat

Aidez-moi, s'il vous plaît, comment string.equals en Java fonctionne-t-il avec une valeur null? Y at-il un problème avec les exceptions? Trois cas:

boolean result1,result2, result3;

    //1st case
    String string1 = null;
    String string2 = null;
    result = string1.equals(string2);
    //2nd case
    String string1 = "something";
    String string2 = null;
    result2 = string1.equals(string2);
    //3rd case 
    String string1 = null;
    String string2 = "something";
    result3 = string1.equals(string2);

Quelles sont les valeurs des résultats? J'attends ces valeurs:

result1 est vrai;
result2 est faux;
result3 est faux;

7
user1097772

Vous ne pouvez pas utiliser l'opérateur dereference (point, '.') Pour accéder à des variables d'instance ou à des méthodes d'appel sur une instance si cette instance est null. Cela donnerait une NullPointerException.

Il est courant d'utiliser quelque chose que vous savez non nul pour la comparaison de chaînes. Par exemple, "something".equals(stringThatMayBeNull).

31
sjr

En effet, vous ne pouvez pas utiliser l'opérateur point sur une variable null pour appeler une méthode non statique.

Malgré cela, tout dépend de la redéfinition de la méthode equals() de la classe Object. Dans le cas de la classe String, est:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

Si vous transmettez null en paramètre, les deux "if" échoueront en renvoyant false;

Une alternative à votre cas est de construire une méthode pour vos besoins:

public static boolean myEquals(String s1, String s2){
    if(s1 == null)
        return s2 == null;
    return s1.equals(s2);
}
11
elias

Ce morceau de code lancera un NullPointerException à chaque fois que chaîne1 est null et que vous y appelez equals, comme c'est le cas lorsqu'une méthode est invoquée implicitement sur un objet null.

Pour vérifier si une chaîne est nulle, utilisez == plutôt que equals.

Bien que result1 et result3 ne soient pas définis en raison de NullPointerExceptions, result2 serait faux (si vous l'exécutiez en dehors du contexte des autres résultats).

2
Vulcan

Utilisez Objects.equals() pour comparer des chaînes ou tout autre objet si vous utilisez JDK 7 ou une version ultérieure. Il gérera les nulls sans lancer d'exceptions. Voir plus ici: comment-faire-comparer-chaînes-en-Java

2
Erk

Pour éviter les NPE lors de la comparaison de chaînes si au moins une d'entre elles peut être nulle, utilisez la méthode StringUtils.equals, qui est sécurisée à NULL.

1
AniaG

Vous obtiendrez une exception NullPointerException dans les cas 1 et 3.

Vous ne pouvez appeler aucune méthode (telle que equals()) sur un objet null.

1
Chip

Nous ne pouvons pas utiliser l'opérateur point avec null car cela donnera NullPointerException. Par conséquent, nous pouvons tirer parti du bloc try..catch dans notre programme. C'est une façon très rudimentaire de résoudre votre problème, mais vous obtiendrez le résultat souhaité.

try {
   result = string1.equals(string2);
} catch (NullPointerException ex) {
   result = string2 == null; //This code will be executed only when string 1 is null
}
0
Sam