2012-02-16 198 views
1

我想使用泛型構建一個通用棧。Java泛型空指針異常

public class UniversalStack<E> implements StackInterface<E> { 

    private E[] stack; 
    private int dim; 
    private int index; 

    @SuppressWarnings("unused") 
    public UniversalStack(int dim) 
    { 
     this.dim=dim; 
     this.index=0; 
     @SuppressWarnings("unchecked") 
     E[] stack = (E[]) new Object[dim]; 


    } 

    @Override 
    public void push(E el) { 
     // TODO Auto-generated method stub 
     if(index+1<dim) 
     { 
      stack[index] = el; 
      index=index+1; 
     } 

    } 
} 

一切都成功地編譯。問題是當我把以下內容:

UniversalStack<Integer> integerStack = new UniversalStack<>(10); 
integerStack.push(new Integer(1)); 

我得到

Exception in thread "main" java.lang.NullPointerException 
    at com.java.lab4.UniversalStack.push(UniversalStack.java:41) 
    at com.java.lab4.testStack.main(testStack.java:14) 

你能解釋我什麼我做錯了?如果我犯了一個愚蠢的錯誤,不要對我苛刻,我是一個初學者,所以我不太瞭解。

回答

7

你重新聲明stack你的構造中,而不是分配給外stack

E[] stack = (E[]) new Object[dim]; 

應該

stack = (E[]) new Object[dim]; 

因此push使用時stack爲空。

+0

啊,這是它。我不知道我再聲明的堆疊成員,直到我看了一遍後,我張貼在這裏。謝謝 ! – Teo 2012-02-16 17:39:35

+2

我認爲日食試圖警告你,但你添加了suppresswarnings註釋:-) – 2012-02-16 17:45:43

-1

只需使用Java已存在的堆棧類。

Stack<Integer> stack = new Stack<Integer>(); 

更多的文檔是在這裏http://docs.oracle.com/javase/6/docs/api/java/util/Stack.html

+0

我很困惑,爲什麼這個保證-1?他試圖使用堆棧,我建議他使用已經存在的堆棧實現?看起來像一個更好的主意,使用存在的東西,並嘗試和真實比寫你自己.... – dsingleton 2012-02-17 18:16:00