2012-02-16 193 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