2 votes

Problème étrange dans la comparaison d'égaux

J'ai un problème étrange avec la syntaxe suivante :

Le bloc de code suivant ne lève pas l'exception du pointeur nul.

Map<String, String> requestHeaderMap = FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap();

if(!"partial/ajax".equals(requestHeaderMap.get("faces-request")))    
{
    System.out.println("This works");
}

Mais celui-ci lève l'exception du pointeur nul :

FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap().get("faces-request").equals("partial/ajax")

Je n'arrive pas à comprendre ce qui ne va pas ici. Je ne vois pas de différence entre les deux appels, sauf pour la lisibilité.

6voto

sharakan Points 4208

FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap().get("faces-request") est nulle. Votre version qui fonctionne le fait parce que vous avez inversé les égalités, les deux opérations se résument à :

null.equals(object)

ou

object.equals(null)

le premier lance un NullPointerException la seconde est fausse.

2voto

Ryan Stewart Points 46960

Les deux font les choses dans des ordres différents. C'est comme la différence entre x.equals(y) y y.equals(x) . Si y est nul, seul le second déclenchera un NPE. Dans votre cas, requestHeaderMap.get("faces-request") est nulle.

L'exception n'est pas levée, car *.equals(null) est parfaitement acceptable :

"partial/ajax".equals(requestHeaderMap.get("faces-request")

D'un autre côté, cela revient à essayer de déréférencer null :

getRequestHeaderMap().get("faces-request").equals("partial/ajax")

1voto

mstrewe Points 411
if(!"partial/ajax".equals(requestHeaderMap.get("faces-request")))  

est vrai car cela signifie

if( !("partial/ajax".equals(null)).

Si vous essayez

null.equals("partial/ajax")

cela soulèvera l'exception.

0voto

OldCurmudgeon Points 16615

C'est parce que getRequestHeaderMap().get("faces-request") peut retourner null y null.equals("partial/ajax") lance une exceoption.

Cependant, "partial/ajax".equals(...) ne lèvera jamais une exception, même s'il est comparé à null .

C'est, à mon avis, la meilleure solution. sólo Le bon côté de la chose Joda construire.

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