0

我是java新手,我正在尝试编写一个链接列表堆栈..

public class Stack {

    private Node first;

    private class Node {
        int item;
        Node next;
    }

    public boolean IsEmpty()
    {
        return first==null;
    }

    public void push(int item)
    {
        Node oldfirst=first;
        first=new Node();
        first.item=item;
        first.next=oldfirst;
    }

    public int pop ()
    {
        int item=first.item;
        first=first.next;
        return item;
    }
}

import javax.swing.*;

public class main {

    public static void main(String[] args) {
        Stack ob=null;
        int num=0;
        while (true)
        {
            num=Integer.parseInt(JOptionPane.showInputDialog("Enter the number"));
            ob.push(num);
            if (num==0)
                break;
        }
        int k;
        k=ob.pop();
        JOptionPane.showMessageDialog(null, k);     
    }

现在,当我通过 main.main(main.java:18) 处的 Execption java.lang.NullPointerException 输入数字时

为什么会发生这种情况以及如何避免它请耐心等待并提前致谢

4

3 回答 3

5

当您调用 push 时,您的堆栈ob为空。你需要实例化它。代替

Stack ob=null;

你需要有

Stack ob = new Stack();
于 2013-02-20T14:23:33.553 回答
4

你的代码:

Stack ob=null
...
ob.push(num);

obnull,你永远不会给它分配一个对象。调用方法null总是会导致NullPointerException.

你可以像这样修复它:

Stack ob = new Stack();
于 2013-02-20T14:23:09.210 回答
0

大多数例外都有一个不言自明的名称。例如,这是一个 NullPointerException - 正在访问一个空对象并且正在调用该异常。

您试图将“ob”定义为新的 Stack 对象,尽管您只是将其定义为 null。在定义和方法调用(ob.push())之间,ob 没有被再次修改,因此它保持为空,导致异常。

要解决此问题,您需要确保在调用对象时该对象不为空。有两种方法可以修复错误。

首先,您可以实例化对象。这将使程序按您希望的方式工作。为此,只需像这样定义对象:Stack ob = new Stack();而不是Stack ob = null;.

解决此问题的第二种方法是捕获错误。这将使程序在发生错误时继续运行。我建议您在对象可能为空时使用它,这样程序就不会直接关闭。为此,请使用 try-catch-clause 围绕该行:

try
{
    ob.push(num);
}
catch (NullPointerException e)
{
    System.out.println("Error at: ob.push(num);");
}
于 2013-02-20T14:36:33.503 回答