NullPointerException при сравнении данных в двух узлах - PullRequest
0 голосов
/ 19 октября 2019

Я получаю исключение нулевого указателя для двух циклов while. Я не знаю, почему я получаю эту ошибку, может кто-нибудь, пожалуйста, посмотрите на код и дайте мне знать, почему я получаю эту ошибку. Я разместил свой код ниже вместе с тестовым кодом, который я использую. Любая помощь будет принята с благодарностью.

private MyNode partitionHelper(MyNode inHeader, MyNode inTrailer) {

        // Assume the numbers array is global
        T pivot = inHeader.data;
        MyNode leftPos = inHeader;
        MyNode rightPos = inTrailer;
        while (true) {
            // Increment l while numbers[l] < pivot
            while ((leftPos.data).compareTo(pivot) > 0) {
                leftPos = leftPos.next;
            }
            // Decrement h while pivot < numbers[h]
            while ((pivot).compareTo(rightPos.data) > 0) {
                rightPos = rightPos.prev;
            } // If there are zero or one elements remaining,
            // all numbers are partitioned. Return h
            if (leftPos == rightPos || rightPos.next == leftPos) {
                return rightPos;
            } // Swap numbers[l] and numbers[h],
            // update l and h 
            else {


                leftPos.next = rightPos.next;
                rightPos.prev = leftPos.prev;

                if (leftPos.prev == rightPos) {
                    leftPos.prev = rightPos;
                    rightPos.next = leftPos;
                } else {
                    leftPos.prev = rightPos.prev;
                    rightPos.next = leftPos.next;


                }  
                leftPos = leftPos.next;
                rightPos = rightPos.prev;
            }

        }
    }

   ll.add(21016);
        ll.add(25326);
        ll.add(9026);
        ll.add(1297);
        ll.add(17432);
        ll.add(30599);
        ll.add(21367);


        System.out.println(ll);
        int j = ll.partition();
        // partition returns the data, not the index, but you can
        // probably still see the partitions.
        System.out.println("j=" + j);
        System.out.println(ll);

    }

1 Ответ

0 голосов
/ 20 октября 2019

Вероятно, ваша проблема здесь:

while ((leftPos.data).compareTo(pivot) > 0) {
      leftPos = leftPos.next;
}
while ((pivot).compareTo(rightPos.data) > 0) {
      rightPos = rightPos.prev;
}

Вы не проверяете, есть ли leftPos next или rightPos имеет предыдущие версии. Так что если ваш leftPos последний, то leftPos.next будет нулевым, и на следующей итерации цикла while вы попытаетесь получить leftPos.data - здесь вы получите NullPointer.

Вам следует проверить, является ли next или prev нетnull:

while ((leftPos.data).compareTo(pivot) > 0  && leftPos.next!=null) {
      leftPos = leftPos.next;
}
while ((pivot).compareTo(rightPos.data) > 0 && rightPos.prev!=null) {
      rightPos = rightPos.prev;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...