2010-11-27 6 views
0

Salut J'ai écrit un tel code mais il va retourner cette exception .et je ne sais pas pourquoi s'il vous plaît aidez-moi merci.à propos de l'exception de pointeur nul

  private void Scan(DoublyLinkedList dList) { // T(n) = O(n) 
    DNode p1 = dList.getFirst(); 


    while (p1!=null) { 


     DNode p2 = p1.next; 
     System.out.println(p1.getElement().toString()+"lol"); 
     if (p2.next!=null) { 

     DNode p3 = p2.next; 

      if(p3.getElement()!=null){ 

       boolean b = Determinate.isPointRightSide(p1.getElement(), p2.getElement(),p3.getElement()); 

       if (b == true) { 
        p1 = p1.next; 
       } else { 
        p1.next = p3; 
        p3.prev = p1; 
        dList.remove(p2); 
        p1 = p1.prev; 
       } 


      } 
      else break; 


    }else break;} 

} 

    public static double determinate(Object get, Object get0, Object get1) { 

    double data[][] = new double[3][2]; 

    data[0][0] = ((Point) get).getX(); 
    data[0][1] = ((Point) get).getY(); 
    data[1][0] = ((Point) get0).getX(); 
    data[1][1] = ((Point) get0).getY(); 
    **data[2][0] = ((Point) get1).getX();** 
    data[2][1] = ((Point) get1).getY(); 


    return ((data[0][0] * (data[1][1] - data[2][1])) - (data[1][0] * (data[0][1] - data[2][1])) + (data[2][0] * (data[0][1] - data[1][1]))); 
} 

exception:

run: 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
     at ConvexHull.Determinate.determinate(Determinate.java:55) 
     at ConvexHull.Determinate.isPointRightSide(Determinate.java:15) 
     at ConvexHull.GrahamVersion.Scan(GrahamVersion.java:104) 
     at ConvexHull.GrahamVersion.grahamScan(GrahamVersion.java:83) 
     at ConvexHull.GrahamVersion.<init>(GrahamVersion.java:25) 
     at UI.MainFrame.grahamButtonActionPerformed(MainFrame.java:221) 

cela montre que "p3" est nul! mais j'ai vérifié "p3" pourquoi il renvoie "null" encore? J'utilise fort pour montrer ces lignes qui lève exception.

EDIT: Ihave édité mon post, mais il lancera cette exception pour "p1"

+0

Je jure que je viens de parler sur une question similaire à celle-ci. Avez-vous vérifié que vos objets 'get' ne sont pas' null'? – birryree

+0

obtenir l'objet pour p3 est nul! Je ne sais pas pourquoi? Je l'ai vérifié avant avec! P3.equals (null) – user472221

+0

J'ai utilisé p3! = null mais jette toujours une exception nullpointer. – user472221

Répondre

4

Une chose qui semble erroné est:

if (!p3.equals(null)) 

Ce sera généralement toujours vrai (si p3 != null) ou jeter un NullPointerException (si p3 == null)

La bonne façon de tester si p3 est non nulle est la suivante:

if (p3 != null) 

Bien que cela puisse ne pas être la raison pour laquelle vous obtenez votre NullPointerException

Si le NullPointerException se produit sur la ligne que vous mettez en évidence, il doit être parce que get1 est nulle. Ceci est passé en tant que p3.getElement(), alors découvrez si cela pourrait être nul.

En théorie, si data[2] était nulle alors data[2][0] serait une NullPointerException mais puisque vous initialisez data alors ce ne sera pas le problème dans ce cas.

De même, existe-t-il une raison pour laquelle vos paramètres pour determinate() sont Object au lieu de Point? Si c'est votre code actuel et non un cas de test simplifié, alors les paramètres devraient tous être Point puisque c'est ce qu'ils doivent être.

Edit:
Je vois que vous avez changé votre code d'origine pour ajouter quelques-unes des suggestions sur cette page.

Mais je vois encore quelques problèmes:

while (p1!=null) { 
    DNode p2 = p1.next; 

    if (p2.next!=null) { 
//  ^^^^^^^ If p2 is null, then this will throw NullPointerException 

    DNode p3 = p2.next; 

    if(p3.getElement()!=null){ 
//  ^^^^^^^^^^^^^^^ If p3 is null, then this will throw NullPointerException 


     boolean b = Determinate.isPointRightSide(p1.getElement(), p2.getElement(),p3.getElement()); 
//            ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ if one of these returns null then isPointRightSide() will throw a NullPointerException 
+0

Oui. Vous devez l'écrire comme "if (p3! = Null)". – MBCook

+0

Je l'ai corrigé mais je lance encore cette exception pour "p3" – user472221

+0

aussi mon élément dans chaque noeud est un objet. – user472221

0

Je suis sûr que vous avez la mauvaise ligne, parce que cela:

!p3.equals(null) 

ne fonctionne pas - que ligne (ou les impliquant p1 ou p2) lance l'exception. Vous ne pouvez pas appeler une méthode sur un null, y compris equals(). Utilisez cette place pour tous vos null contrôles:

p3 != null 
+0

Je l'ai utilisé mais il jette encore nullpointerexception !!!! – user472221

+0

aussi mon élément dans chaque nœud est un objet. – user472221

+0

@ user472221: votre code actuel vérifie seulement p3.getElement() pour null mais pas p3 –