La chose la plus simple est d'essayer la vérification de null avec equals()et de voir. Lorsque vous essayez, il sera instantanément évident
Goran Jovic
À propos, une recherche Google avec les mots clés "java null check" (sans guillemets) m'a donné comme l'un des meilleurs résultats de ce fil , qui a les mêmes informations que les réponses ici.
Mitch Schwartz
Réponses:
179
Ce sont deux choses complètement différentes. ==compare la référence d'objet, le cas échéant, contenue dans une variable. .equals()vérifie si deux objets sont égaux selon leur contrat pour ce que signifie l'égalité. Il est tout à fait possible que deux instances d'objets distinctes soient «égales» selon leur contrat. Et puis il y a le détail mineur qui equalsest une méthode, si vous essayez de l'invoquer sur une nullréférence, vous obtiendrez un NullPointerException.
Par exemple:
classFoo{privateint data;Foo(int d){this.data = d;}@Overridepublicboolean equals(Object other){if(other ==null|| other.getClass()!=this.getClass()){returnfalse;}return((Foo)other).data ==this.data;}/* In a real class, you'd override `hashCode` here as well */}Foo f1 =newFoo(5);Foo f2 =newFoo(5);System.out.println(f1 == f2);// outputs false, they're distinct object instancesSystem.out.println(f1.equals(f2));// outputs true, they're "equal" according to their definitionFoo f3 =null;System.out.println(f3 ==null);// outputs true, `f3` doesn't have any object reference assigned to itSystem.out.println(f3.equals(null));// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anythingSystem.out.println(f1.equals(f3));// Outputs false, since `f1` is a valid instance but `f3` is null,// so one of the first checks inside the `Foo#equals` method will// disallow the equality because it sees that `other` == null
@Xepoch: Non, je ne crée généralement pas de champs publics (même si cela n'a pas vraiment d'importance pour cet exemple de toute façon). Pourquoi?
TJ Crowder du
@TJ Crowder "Ce sont deux choses complètement différentes .." en général oui. Cependant, l'implémentation par défaut des deux est la même, si ma compréhension est correcte. En regardant le code source, .equals () effectue essentiellement une vérification ==. hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/…
Ayush
1
@Ayush - C'est la valeur par défaut Object, oui. Il est cependant remplacé par un grand nombre de classes JDK. Mais ce n'est pas une question d'implémentation, mais de sémantique. (Note latérale: JDK7 est très obsolète.)
TJ Crowder
Bon, cela a du sens, je voulais juste clarifier.
Ayush
38
si vous invoquez .equals(), nullvous obtiendrezNullPointerException
Il est donc toujours conseillé de vérifier la nullité avant d'appeler la méthode où qu'elle s'applique
Votre exemple est généralement mieux rédigé sous la forme if ("hi".equals(str)).
ColinD
3
@ user368186: le point n'est pas de savoir si la méthode equals inclut une vérification nulle. Si votre référence d'objet est nulle, l'appel someObject.equals(null)lèvera a NullPointerExceptionsans jamais entrer la méthode equals.
Dave Costa
2
@ColinD D'accord, il suffit de démontrer ici
Jigar Joshi
2
Il est toujours conseillé d'éviter à tout prix les valeurs nulles, vous n'avez donc pas du tout besoin de vérifications nulles;).
fwielstra
2
Vous pouvez toujours utiliser Objects.equals(a, b)Cela ne lèvera pas NullPointerException, mais cela dépend toujours de la méthode "égale" du "a" et du "b"
Depuis Java 1.7, si vous souhaitez comparer deux objets qui peuvent être nuls, je recommande cette fonction:
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
Cette classe se compose de méthodes utilitaires statiques permettant d'opérer sur des objets. Ces utilitaires incluent des méthodes de sécurité nulle ou tolérantes à zéro pour calculer le code de hachage d'un objet, renvoyer une chaîne pour un objet et comparer deux objets.
Juste pour le rendre plus visible pour les autres (voir la réponse de chin90 ou le JavaDoc ): Objects.equals(null, null)reviendra true- gardez cela à l'esprit.
Thomas
20
En Java, 0 ou null sont des types simples et non des objets.
La méthode equals () n'est pas conçue pour les types simples. Les types simples peuvent être mis en correspondance avec ==.
Si une variable Object est nulle, on ne peut pas appeler une méthode equals () dessus, donc une vérification de référence d'objet de null est appropriée.
C'est important, car equalsne peut retourner falseou provoquer un NullPointerException(ou quelque chose de différent si la equalsméthode surchargée est absurde).
Tom du
2
Si nous utilisons la méthode => .equals
if(obj.equals(null))// Which mean null.equals(null) when obj will be null.
Lorsque votre obj sera nul, il lèvera une exception de point nul.
Object.equals est null safe, mais sachez que si deux objets sont null, object.equals retournera true donc assurez-vous de vérifier que les objets que vous comparez ne sont pas null (ou contiennent des valeurs nulles) avant d'utiliser object.equals pour Comparaison.
Comme indiqué par le JavaDoc (il est toujours sage de les lire): Consequently, if both arguments are null, true is returned. ...:)
Thomas
1
Étant donné qu'égal est une fonction dérivée de la classe Object, cette fonction compare les éléments de la classe. si vous l'utilisez avec null, il retournera false car le contenu de la classe n'est pas nul. De plus == compare la référence à un objet.
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/privatestaticfinalclassNull{/**
* A Null object is equal to the null value and to itself.
*
* @param object
* An object to test for nullness.
* @return true if the object parameter is the JSONObject.NULL object or
* null.
*/@Overridepublicboolean equals(Object object){return object ==null|| object ==this;}}
Le problème ici est que cela field.equals(null)renvoie vrai. Cela rompt le comportement habituel de Java et prête donc à confusion. Cela ne devrait fonctionner que pour field.equals("null"), du moins à mon avis. Je ne sais pas pourquoi les développeurs de la bibliothèque ont pensé que ce serait bon à supporter.
Tom
Btw, votre première phrase a un problème de grammaire et ce que vous voulez dire n'est pas clair. Voulez-vous dire "Voici un exemple où str != nullet de str.equals(null)retour truelors de l'utilisation de org.json ."?
Tom
Je pense que c'est parce que le jsonObjectcontient la clé "field", c'est pourquoi il fieldn'est pas nul, il a une référence qui contient l' json.org.JSONObject$Null objet
dina
Oui, mais je ne traiterais pas Nullcomme nullet utiliserais à la "null"place. Mais je suppose qu'ils ont fait cela pour éviter d'avoir besoin de cordes. Mais même avec cette bibliothèque, field.equals(null)c'est toujours presque toujours un problème: P.
Tom
0
Donc, je ne me trompe jamais et évite les problèmes avec cette solution:
De plus, une chaîne vide (de ""longueur 0) est quelque chose de complètement différent d'une nullréférence (c'est-à-dire pas de chaîne).
Thomas
0
J'ai rencontré ce cas hier soir.
Je détermine simplement que:
N'existe pas la méthode equals () pour null Donc, vous ne pouvez pas invoquer une méthode inexistante si vous n'avez pas
- >>> C'est la raison pour laquelle nous utilisons == pour vérifier null
Votre code enfreint la loi de Demeter. C'est pourquoi il est préférable de refactoriser le design lui-même. Pour contourner ce problème, vous pouvez utiliser facultatif
equals()
et de voir. Lorsque vous essayez, il sera instantanément évidentRéponses:
Ce sont deux choses complètement différentes.
==
compare la référence d'objet, le cas échéant, contenue dans une variable..equals()
vérifie si deux objets sont égaux selon leur contrat pour ce que signifie l'égalité. Il est tout à fait possible que deux instances d'objets distinctes soient «égales» selon leur contrat. Et puis il y a le détail mineur quiequals
est une méthode, si vous essayez de l'invoquer sur unenull
référence, vous obtiendrez unNullPointerException
.Par exemple:
la source
public int data
?Object
, oui. Il est cependant remplacé par un grand nombre de classes JDK. Mais ce n'est pas une question d'implémentation, mais de sémantique. (Note latérale: JDK7 est très obsolète.)si vous invoquez
.equals()
,null
vous obtiendrezNullPointerException
Il est donc toujours conseillé de vérifier la nullité avant d'appeler la méthode où qu'elle s'applique
Regarde aussi
la source
if ("hi".equals(str))
.someObject.equals(null)
lèvera aNullPointerException
sans jamais entrer la méthode equals.Objects.equals(a, b)
Cela ne lèvera pas NullPointerException, mais cela dépend toujours de la méthode "égale" du "a" et du "b"En plus de la réponse acceptée ( https://stackoverflow.com/a/4501084/6276704 ):
Depuis Java 1.7, si vous souhaitez comparer deux objets qui peuvent être nuls, je recommande cette fonction:
la source
Objects.equals(null, null)
reviendratrue
- gardez cela à l'esprit.En Java, 0 ou null sont des types simples et non des objets.
La méthode equals () n'est pas conçue pour les types simples. Les types simples peuvent être mis en correspondance avec ==.
la source
Que se passe-t-il si foo est nul?
Vous obtenez une NullPointerException.
la source
Si une variable Object est nulle, on ne peut pas appeler une méthode equals () dessus, donc une vérification de référence d'objet de null est appropriée.
la source
Si vous essayez d'appeler equals sur une référence d'objet nulle, vous obtiendrez une exception de pointeur nul levée.
la source
Selon les sources , peu importe ce qu'il faut utiliser pour l'implémentation de la méthode par défaut:
Mais vous ne pouvez pas en être sûr
equals
dans la classe personnalisée.la source
equals
ne peut retournerfalse
ou provoquer unNullPointerException
(ou quelque chose de différent si laequals
méthode surchargée est absurde).Si nous utilisons la méthode => .equals
Lorsque votre obj sera nul, il lèvera une exception de point nul.
nous devrions donc utiliser ==
il comparera les références.
la source
Object.equals est null safe, mais sachez que si deux objets sont null, object.equals retournera true donc assurez-vous de vérifier que les objets que vous comparez ne sont pas null (ou contiennent des valeurs nulles) avant d'utiliser object.equals pour Comparaison.
L'exemple d'extrait ci-dessus renverra égal!
la source
Consequently, if both arguments are null, true is returned. ...
:)Étant donné qu'égal est une fonction dérivée de la classe Object, cette fonction compare les éléments de la classe. si vous l'utilisez avec null, il retournera false car le contenu de la classe n'est pas nul. De plus == compare la référence à un objet.
la source
false
ouNullPointerException
(s'ilequals
n'est pas remplacé par quelque chose de mauvais).voici un exemple où
str != null
maisstr.equals(null)
lors de l'utilisationorg.json
EDIT: voici la classe org.json.JSONObject $ Null :
la source
field.equals(null)
renvoie vrai. Cela rompt le comportement habituel de Java et prête donc à confusion. Cela ne devrait fonctionner que pourfield.equals("null")
, du moins à mon avis. Je ne sais pas pourquoi les développeurs de la bibliothèque ont pensé que ce serait bon à supporter.str != null
et destr.equals(null)
retourtrue
lors de l'utilisation de org.json ."?jsonObject
contient la clé "field", c'est pourquoi ilfield
n'est pas nul, il a une référence qui contient l'json.org.JSONObject$Null
objetNull
commenull
et utiliserais à la"null"
place. Mais je suppose qu'ils ont fait cela pour éviter d'avoir besoin de cordes. Mais même avec cette bibliothèque,field.equals(null)
c'est toujours presque toujours un problème: P.Donc, je ne me trompe jamais et évite les problèmes avec cette solution:
la source
""
longueur 0) est quelque chose de complètement différent d'unenull
référence (c'est-à-dire pas de chaîne).J'ai rencontré ce cas hier soir.
Je détermine simplement que:
la source
Votre code enfreint la loi de Demeter. C'est pourquoi il est préférable de refactoriser le design lui-même. Pour contourner ce problème, vous pouvez utiliser facultatif
ci-dessus est de vérifier la hiérarchie d'un objet donc utilisez simplement
si vous n'avez qu'un seul objet à vérifier
J'espère que cela t'aides !!!!
la source
Tu pourrais toujours faire
Cela vérifiera d'abord la référence de l'objet, puis vérifiera l'objet lui-même en fournissant que la référence n'est pas nulle.
la source
x.equals(null)
.