我的java代码有什么问题?
我在Java新,我试图写一个链表栈..我的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);
}
现在
,当我通过 的Execption显示java.lang.NullPointerException输入一个数字,编译器 在main.main(main.java:18)
为什么发生这种情况,以及如何避免它 请耐心等待,在此先感谢
你的筹码ob
为空当你调用推动。你需要实例化它。取而代之的
Stack ob=null;
你需要有
Stack ob = new Stack();
您的代码:
Stack ob=null
...
ob.push(num);
ob
是null
,你从来没有一个对象分配给它。在null
上调用方法将始终导致NullPointerException
。
你能解决这个问题是这样的:
Stack ob = new Stack();
大多数的异常都有一个不言自明的名字。例如,这个是一个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);");
}
感谢您的支持^^ – Coderji 2013-02-20 14:41:40
@OsamaEspil不客气 - 最好避免错误,但抓住它们不会让程序崩溃。 – 2013-02-20 14:44:43
一般来说,你不应该抓住NPE;他们通常会指出编程错误,就像他们在@ Osama案中所做的一样。 – GriffeyDog 2013-02-20 15:09:56
哇!我不知道如果你没有承包商,你可以像这样初始化它! – Coderji 2013-02-20 14:38:32
@OsamaEspil如果你没有定义一个构造函数Java为你做。有关更多详细信息,请参阅此[回答](http://stackoverflow.com/a/4488766/264775)。 – thegrinner 2013-02-20 14:45:22