об исключении нулевого указателя - PullRequest
0 голосов
/ 27 ноября 2010

Привет! Я написал такой код, но он выдаст это исключение. И я не знаю, почему, пожалуйста, помогите мне, спасибо.

         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", почему он снова возвращает "ноль"?Я использую strong для показа тех строк, которые выдают исключение.

РЕДАКТИРОВАТЬ: Я редактировал мой пост, но он выдаст это исключение для "p1"

Ответы [ 2 ]

4 голосов
/ 27 ноября 2010

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

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,в этом случае проблем не будет.

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

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

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

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 голосов
/ 27 ноября 2010

Я почти уверен, что вы ошиблись, потому что это:

!p3.equals(null)

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

p3 != null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...