【问题标题】:What is wrong with my java code?我的 java 代码有什么问题?
【发布时间】:2013-02-20 14:22:09
【问题描述】:

我是 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);     
    }

现在当我输入一个数字时,编译器通过 一个执行 java.lang.NullPointerException 在 main.main(main.java:18)

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

【问题讨论】:

    标签: java nullpointerexception stack


    【解决方案1】:

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

    Stack ob=null;
    

    你需要

    Stack ob = new Stack();
    

    【讨论】:

    • 哇!!我不知道如果你没有承包商你可以这样初始化它!!!
    • @OsamaEspil 如果您没有定义构造函数,Java 会为您完成。有关详细信息,请参阅此answer
    【解决方案2】:

    您的代码:

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

    obnull,你永远不会为它分配一个对象。在null 上调用方法将始终导致NullPointerException

    你可以这样修复它:

    Stack ob = new Stack();
    

    【讨论】:

      【解决方案3】:

      大多数例外都有一个不言自明的名称。例如,这是一个 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);");
      }
      

      【讨论】:

      • 感谢您的帮助^^
      • @OsamaEspil 不客气 - 最好避免错误,但捕获会阻止它们使程序崩溃。
      • 一般来说你不应该捕获 NPE;它们通常表示编程错误,就像在 @Osama 的案例中所做的那样。
      猜你喜欢
      • 2019-06-06
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多