2010-11-27 3 views
0

Hi Я написал такой код, но он вернет это исключение. И я не знаю, почему, пожалуйста, помогите мне.о null указатель исключение

  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]))); 
} 

исключение:

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) 

это покажет, что "p3" равна нулю! но я проверил «p3», почему он снова возвращает «null»? Я использую сильный для отображения тех линий, которые вызывают исключение.

EDIT: Ihave редактировал свой пост, но он будет бросать это исключение для «p1»

+0

Я клянусь, что я просто прокомментировал вопрос, подобный этому. Убедитесь, что вы проверяете, не являются ли ваши `get` объектами` null '? – birryree 2010-11-27 03:29:26

+0

получить объект для p3 null! Я не знаю, почему? Я проверил его раньше с! P3.равный (null) – user472221 2010-11-27 03:36:45

+0

I б/у p3! = null но все еще бросает nullpointerexception. – user472221 2010-11-27 03:49:03

ответ

4

Одна вещь, которая выглядит неправильным является:

if (!p3.equals(null)) 

Как правило, это всегда будет верно (если p3 != null) или бросить NullPointerException (если p3 == null)

правильный способ проверить, является ли p3 не равно нулю является:

if (p3 != null) 

Хотя это не может быть, почему вы получаете ваш NullPointerException

Если NullPointerException происходит на линии, которую вы выделить, это должно быть, потому что get1 равна нулю. Это передается как p3.getElement(), так что выясните, может ли оно быть нулевым.

В теории, если data[2] был нулевым, тогда data[2][0] бы бросить NullPointerException, но так как вы инициализации data то, что не будет проблемой в этом случае.

Также есть некоторые причины, по которым ваши параметры для define() равны Object вместо Point? Если это ваш фактический код, а не какой-то упрощенный тестовый сценарий, то все параметры должны быть Point, так как это то, что они должны быть.

Edit:
Я вижу, что вы изменили свой первоначальный код, чтобы добавить некоторые из предложений на этой странице.

Но я до сих пор вижу некоторые проблемы:

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

Я уверен, что вы получили неправильную линию, потому что это:

!p3.equals(null) 

не будет работать - что линия (или тех, с участием p1 или p2) бросает Исключение. Вы не можете вызвать любой метод на null, включая equals(). Используйте это вместо того, чтобы все ваши null проверки:

p3 != null 
Смежные вопросы