2013-02-20 134 views
0

我在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)

爲什麼發生這種情況,以及如何避免它 請耐心等待,在此先感謝

回答

4

你的籌碼ob爲空當你調用推動。你需要實例化它。取而代之的

Stack ob=null; 

你需要有

Stack ob = new Stack(); 
+0

哇!我不知道如果你沒有承包商,你可以像這樣初始化它! – Coderji 2013-02-20 14:38:32

+0

@OsamaEspil如果你沒有定義一個構造函數Java爲你做。有關更多詳細信息,請參閱此[回答](http://stackoverflow.com/a/4488766/264775)。 – thegrinner 2013-02-20 14:45:22

4

您的代碼:

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

obnull,你從來沒有一個對象分配給它。在null上調用方法將始終導致NullPointerException

你能解決這個問題是這樣的:

Stack ob = new Stack(); 
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);"); 
} 
+0

感謝您的支持^^ – Coderji 2013-02-20 14:41:40

+0

@OsamaEspil不客氣 - 最好避免錯誤,但抓住它們不會讓程序崩潰。 – 2013-02-20 14:44:43

+1

一般來說,你不應該抓住NPE;他們通常會指出編程錯誤,就像他們在@ Osama案中所做的一樣。 – GriffeyDog 2013-02-20 15:09:56