2012-06-09 1 views
0

je l'élément suivant de code à l'intérieur d'une bouclePourquoi lève-t-il une exception de pointeur nul?

MyClass myobj= new MyClass(customers, price); 
System.out.println(myobj); 
if (!myobj.equals(null)) { //same happesn with myobj != null 
    System.out.println("not null"); 
} 
myMethod(myobj); 

corps de myMethod est:

private void myMethod(MyClass myobj) { 
    if (myobj.totalDemand()) { 
     //bla bla 
    } 

Après l'exécution du code dans Junit la ligne "if (myobj.totalDemand())" jette un NullPointerException, mais les impressions de la console « not null »

+3

Et la définition de 'MyClass.totalDemand'? Ou mettez le vrai stacktrace. – Alexander

+2

100% NPE est à l'intérieur totalDemand –

Répondre

3

Si vous appelez myobj.equals(null), il n'y a aucune garantie que la mise en œuvre de equals() pour la classe ne sera pas jeter un NullPointerException, et si myobj est null, vous obtiendrez un NullPointerException essayant d'appeler .equals() sur un objet null.


Pour tester null, utilisez ce code:

if (myobj == null) 

et de tester pour ne pas null, utilisez ceci:

if (myobj != null) 
+1

Comme je l'ai noté dans la question la même chose se produit avec (myobj! = Null) –

+0

Comme Alexander a demandé: pouvez-vous fournir le code pour MyClass.totalDemand? On dirait que votre NPE est à partir de ce méhtod. – Dzik

+0

En fait, une méthode equals qui lance un NPE pour un objet nul viole le contrat égal - equals doit retourner false pour les objets NULL. En réalité, ce n'est pas vraiment un problème, car habituellement votre première ligne en égal est 'o instanceof FooClass' et' instanceof' renvoie false pour null (vraiment utile) – Voo

0

Si myobj est nul, vous obtiendrez NullPointerException, et si ce n'est pas la console qui affichera "not null". Donc, y a-t-il quelque chose dans les variables clients et le prix dans chaque cycle d'invocation?