2009-08-07 9 views
2

Doublons possibles:
Gracefully avoiding NullPointerException in Java
Multilingual fields in DB tablesIf-statement - Vérifie Chaîne contre variable ou variable par rapport à Chaîne?

double exact

Gracefully avoiding NullPointerException in Java

Qu'aimez-vous plus? Je déteste voir le dernier. Cela semble juste en arrière.

String randomtext = "stack overflow"; 

if(randomtext.equals("stack overflow")) 
{ 
     //do something 
} 

ou

String randomtext = "stack overflow"; 

if("stack overflow".equals(randomtext)) 
{ 
    //do something 
} 
+0

Dupe de http://stackoverflow.com/questions/963936/gracefully-avoiding-nullpointerexception-in-java –

+0

Si vous savez avec certitude que randomtext est non nul, le premier est plus lisible. –

Répondre

15

Contrairement à ce que certaines personnes pensent, ces deux ne sont pas fonctionnellement équivalents. Le premier lancera un NullPointerException si le randomtext est null alors que le second ne le fera pas. C'est pourquoi je choisirais ce dernier.

+0

+1 - C'est un très bon point auquel je n'ai pas pensé mais, vous devez admettre que la possibilité d'une exception dépend de l'implémentation. –

+0

En fait, je n'y ai pas pensé. C'est un bon point! – Tommy

0

je dirais que l'opinion générale irait vers le premier, il est plus facile à lire.

0

Selon l'implémentation, cela pourrait être une préférence personnelle.

Maintenant, s'il y a une possibilité que randomtext sera nulle, je pense que le message de Merdad est important.

Mais étant donné votre exemple,

String randomtext = "stack overflow"; 

if(randomtext.equals("stack overflow")) 
{ 
     //do something 
} 

il ne sera pas question parce que dans ce cas randomtext va toujours être « débordement de pile ».

Si vous voulez savoir ce qui est "mieux", alors cela dépend de pourquoi c'est mieux et c'est à vous de décider.

1

Je préfère le premier. J'aime écrire les conditions comme: Test_Subject < -> Control_Value

2

Si la variable de chaîne peut être null, vous voulez toujours faire passer le littéral en premier.

"stack overflow".equals(randomtext) 

ne causera jamais un NullPointerException, mais

randomtext.equals("stack overflow") 

volonté, si randomtext == null. Pour cette raison, bien que j'aime le variable.equals (littéral), j'ai utilisé le premier.

0

Je préfère

String randomText = "stack overflow"; 
String otherRandomText = "something else"; 

if(randomText.equals(otherRandomText)) 
{ 
    //do something 
} 
+0

La question est pourquoi? Pouvez-vous expliquer votre point de vue - je suis intéressé ... Gardez à l'esprit que 'otherRandomText' prendra alors de la mémoire, ce qui est probablement la raison pour laquelle votre réponse est rejetée. –

0

Je préfère la première aussi bien. Comme le souligne Mehrdad, le second a un avantage technique (ne pas lancer d'exception sur null), mais je pense que c'est moins naturel.

Je ressens la même chose à propos de if (null != myVar) - ça ne me semble pas très bien. Null - ou la chaîne littérale - ne change jamais, alors demander si elle est égale à quelque chose - bien qu'elle soit significative et littéralement correcte - semble juste être fausse.

0

Cela dépend de votre objectif. Tout d'abord, vous ne devriez pas avoir de texte dans vos programmes de toute façon. C'est une pratique standard dans le cas où vous devez changer ce texte à plusieurs endroits. Donc, vraiment, cela devrait être une constante ou une énumération. Dans cet esprit, vous auriez String randomtext = "stack overflow"; const String stackoverflow = "débordement de pile"; Maintenant, demandez-vous qui

semble mieux entre randomtext.equals (stackoverflow) et stackoverflow.equals (randomtext)

Je ne sais pas si cela est vraiment important. Je mettrais habituellement le cas de test réel dans le().

0

En C ou C++, ce dernier type de structure peut être préférable, car il est facile de confondre les deux suivantes

if (randomNumber == 5) si (randomNumber = 5)

Le le second est syntaxiquement valide, mais il s'agit d'une instruction d'assignation qui renvoie toujours vrai, tout en définissant randomNumber à 5. Ce n'est probablement pas ce qui était prévu. Si vous prenez l'habitude d'écrire toujours vos comparaisons C++ en utilisant la structure

if (5 == randomNumber)

Ensuite, vous êtes sûr, parce que si vous écrivez accidentellement = au lieu de ==, le compilateur crier à toi. Cet argument ne contient pas autant d'eau pour l'exemple original publié, mais il explique pourquoi certains programmeurs ont pris l'habitude de mettre la constante en premier lors des comparaisons, même si la plupart des gens pensent que l'inverse semble plus Naturel. Les vieilles habitudes ont la vie dure.

1

J'ai tendance à vérifier null:

if(randomtext != null && randomtext.equals("stack overflow")) 
{ 
     //do something 
} 
0

Je préfère org.apache.commons.lang.StringUtils.equals() et tout cela est lié Fonctions de chaîne. Ensuite, peu importe ce qui est nul, c'est géré pour vous.

Je crois que toutes les méthodes dans StringUtils sont null-safe.

Questions connexes