我的排序方法中的NullPointerException

时间:2011-02-20 20:25:15

标签: java nullpointerexception

我认为我的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 个答案:

答案 0 :(得分:3)

例外情况发生在IntQueue的第47行。作为NullPointerException,可能是由于以下原因:

  

当应用程序在需要对象的情况下尝试使用null时抛出。其中包括:

     
      
  • 调用null对象的实例方法。
  •   
  • 访问或修改空对象的字段。
  •   
  • 将null的长度视为数组。
  •   
  • 访问或修改null的插槽,就像它是一个数组一样。
  •   
  • 抛出null,就好像它是一个Throwable值。
  •   

我的猜测(没有看到IntQueue的代码就是因为你试图将Integer自动装箱到int,但Integernull }。

答案 1 :(得分:0)

嗯,这取决于IntQueue的样子。显然你是从V5.java的第88行调用来自get的{​​{1}}方法,并且该方法在IntQueue.java的第47行失败。这可能是由于将错误的参数传递给方法,或者错误地设置IntQueue或类似的东西。如果没有看到IntQueue的来源并且不知道哪个是V5.java的第88行,那么很难说。 (您发布的代码 88行。)

我建议你看一下IntQueue.java的第47行并检查它试图解除引用的内容,并查看V5.java的第88行,看看它在调用它。然后你应该能够找出bug的位置。

答案 2 :(得分:0)

当您在Java中有异常时,您在堆栈跟踪中有足够的信息来本地化导致问题的原因。

您的stacktrace

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

这意味着在88行的V5类中的main方法中,调用方法get(来自IntQueue)。第47行中的此方法get()对空值进行操作,这会导致NullPointerException

通常,当您遇到异常时,最好的方法是在调试模式下设置断点并检查变量。我建议你在IntQueue中设置47行的断点,然后你会看到错误。