检查数组索引为null时出现NullPointerException

时间:2016-02-24 20:50:31

标签: java nullpointerexception stack

我试图制作堆栈并遇到问题,每当我尝试检查索引值时,我都会遇到NullPointerException。

private E[] items;

public Stack(Class<E> type) {
  E[] items = (E[]) new Object[10];
}

public boolean isEmpty(){
   if(items[0] == null){
       return true;
   }
   return false;
}

当我跑步时

public static void main(String[] args) {
  Stack<String> myStack = new Stack<>( String.class );
  System.out.println(myStack.isEmpty());
} 

我在

获得了NullPointerException
if(items[0] == null)

在调用isEmpty()时。

显然我知道items [0]此时应为null,并且希望能够根据它是否为null来执行操作,在这种情况下,由于堆栈为空,因此返回true。如何在不获取NullPointerException的情况下执行此操作?

2 个答案:

答案 0 :(得分:1)

构造函数中的行

items

创建一个局部变量但不初始化您的类字段items = (E[]) new Object[10]; 。使用

items

编译器会发出警告,double time_diff(struct timeval x , struct timeval y); int main() { int i; struct timeval before , after; gettimeofday(&before , NULL); //Time taking task for (i=1 ; i <= 100 ; i++) { printf("%d %d %d n",i, i*i, i*i*i); } gettimeofday(&after , NULL); printf(" time elapsed : %.0lf" , time_diff(before , after) ); return 0; } double time_diff(struct timeval x , struct timeval y) { double x_ms , y_ms , diff; x_ms = (double)x.tv_sec*1000000 + (double)x.tv_usec; y_ms = (double)y.tv_sec*1000000 + (double)y.tv_usec; diff = (double)y_ms - (double)x_ms; return diff; } 未被使用,因此最好注意这些警告。

答案 1 :(得分:0)

此外,在制作泛型课程时,我建议稍微改变一下。您可以将类声明为通用类,而不是将类作为构造函数参数传递,它将起到相同的作用。

public class Stack<E>
{
    private E[] items;

    public Stack() {
        items = (E[]) new Object[10];
    }

    public boolean isEmpty(){
        if(items[0] == null){
           return true;
         }
         return false;
    }

    public E push(E item){
    ...
    }

    public E peek(){
    ...
    }

    .
    .
    .
}

然后你的主要课程看起来像:

    Stack<String> myStack = new Stack<String>();
    myStack.push("hi");
    System.out.println(myStack.isEmpty());

这更接近地模仿java在泛型类中构建的约定。