NullPointerException в моем методе сортировки - PullRequest
1 голос
/ 20 февраля 2011

Я думаю, что мой rsort() метод должен работать правильно, я всегда получаю исключение:

In Thread "main": java.lang.NullPointerExeception
    at IntQueue.get(IntQueue.java:47)
    at V5.main(V5.java:88)

Почему я получаю это исключение и как я могу его обработать?

IntQueue.java:

class IntQueue
{
    public int get()
    {
        int res = fyrsti.tala;              // <---- this is line 47 -----
        n--;
        if( fyrsti == sidasti )
            fyrsti = sidasti = null;
        else
            fyrsti = fyrsti.naest;
        return res;
    }

    static class Hlekkur
    {
        int tala;
        Hlekkur naest;
    }

    Hlekkur fyrsti;
    Hlekkur sidasti;
    int n;

    public IntQueue()
    {
        fyrsti = sidasti = null;
    }

    public int first()
    {
        return fyrsti.tala;
    }

    public void put( int i )
    {
        Hlekkur nyr = new Hlekkur();
        n++;
        nyr.tala = i;
        if( sidasti==null )
            fyrsti = sidasti = nyr;
        else
        {
            sidasti.naest = nyr;
            sidasti = nyr;
        }
    }

    public int count()
    {
        return n;
    }
}

V5.java:

public class V5
{
    public static void main(String [] args)
    {
        IntQueue q = new IntQueue();
        Random rand = new Random();
        for(int i = 0; i!= 10000; i++)
            q.put(rand.nextInt(1000));
        q = rsort(q);
        int last = q.get();                 // <---- this is line 88 -----
        while(q.count() != 0)
        {
            int x = q.get();
            if(x < last)
                System.out.println("Wrong");
            System.out.println("Right");
            last = x;
        }
    }

    public static IntQueue rsort(IntQueue q)
    {
        IntQueue [] r = new IntQueue[10]; 
        for(int i = 0; i!=10; i++)
            r[i] = new IntQueue();
        IntQueue q2 = q;
        int i = 0, v=1;
        while(i != 3)
        {
            while(q2.count() != 0)
            {
                int x = q.get();
                r[(x/v)%10].put(x);
            }
            for(int j = 0; j!=0; j++)
            {
                if(r[j].count() != 0)
                    q2.put(r[j].get());
                else
                    j++;
            }
            v *= 10;        
            i++;
        }
        return q2;
    }
}

[под ред. примечание: переупорядоченный и сжатый код, чтобы сделать соответствующие строки более заметными]

Ответы [ 3 ]

3 голосов
/ 20 февраля 2011

Исключение происходит в строке 47 из IntQueue. И как NullPointerException это может быть вызвано следующими причинами:

Брошенный, когда приложение пытается использовать нуль в случае, когда объект требуется. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ к полю нулевого объекта или его изменение.
  • Взятие длины нуля, как если бы это был массив.
  • Доступ или изменение пустых слотов, как если бы это был массив.
  • Бросить ноль, как если бы это было значение Throwable.

Полагаю (не видя код IntQueue, это потому, что вы пытаетесь автоматически установить Integer на int, но Integer - это null.

0 голосов
/ 20 февраля 2011

Когда у вас есть исключение в Java, у вас достаточно информации в трассировке стека, чтобы определить причину проблемы.

Ваша трассировка стека

In Thread "main": java.lang.NullPointerExeception
at IntQueue.get(IntQueue.java:47)
at V5.main(V5.java:88)

Это означает, что в вашем методе main в классе V5 на 88 строке вы вызываете метод get (из IntQueue). Этот метод get () в строке 47 работает с нулевым значением, и это вызывает NullPointerException

Часто, когда у вас есть исключение, лучше всего установить точку останова и проверить переменные в режиме отладки. Я рекомендую вам установить точку останова в 47 строк в IntQueue, и тогда вы увидите, что не так.

0 голосов
/ 20 февраля 2011

Ну, это зависит от того, как выглядит IntQueue. Очевидно, вы вызываете метод get из IntQueue из строки 88 V5.java, и этот метод завершается ошибкой в ​​строке 47 IntQueue.java. Это может быть связано с передачей неверного аргумента методу, неправильной настройкой IntQueue или чем-то подобным. Трудно сказать, не видя источник IntQueue и не зная, какая строка 88 из V5.java. (Код, который вы разместили, не имеет 88 строк.)

Я предлагаю вам взглянуть на строку 47 из IntQueue.java и проверить, что он пытается разыменовать, и на строку 88 в V5.java, чтобы увидеть, как она вызывается. Тогда вы сможете понять, где находится ошибка.

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