2013-03-24 88 views
1

我想实现一个数组使用2堆栈和缓冲区。 最初堆栈中填充了随机值,MyArrayI接口包含2个函数:getItemAt(int index)和setItemAt(int index,int item)。并且它们在MyStackArray类中成功实现。 每当我运行程序时,我得到空异常错误,我试图追踪原因,直到我发现堆栈没有填充初始数据 - 也许。每当我尝试访问堆栈或缓冲区时,都会收到NullPointerException错误。当我尝试打印数组堆栈中的元素时,我仍然得到了愚蠢的NPE错误!奇怪的空指针异常

public class MyStackArray implements MyArrayI { 
    private int[] buffer; 
    private int[] stack; 
    private int maxSize; 

    public MyStackArray(int s){ 
     maxSize = s; 
     int[] buffer = new int [maxSize]; 
     int[] stack = new int [maxSize]; 

     for(int i=0; i<maxSize; i++) 
      stack[i]=i; // initiallizing the array with random values. 
    } 

    public void print(){    // tried to check the contents of the stack array. 
     for(int i=0; i<maxSize; i++) 
      System.out.println(stack[i]); // causes Null Pointer Exception. ??! 
     //System.out.println(stack[0]); // still causes the NPE !! 
    } 

    public void setItemAt(int index, int item){ 
     int i; 
     int j; 

      for(i=0, j=maxSize-1 ; i<maxSize && j>=0 ; i++, j--){ 
       if(j == index) 
        break; 
       buffer[i] = stack[j]; //causes a NULL.PointerException 
      } 
      stack[j] = item; 
    } 

    public int getItemAt(int index){ 
     int i; 
     int j; 

      for(i=0, j=maxSize-1 ; i<maxSize && j>=0; i++, j--){ 
       if(j==index) 
        break; 
       buffer[i] = stack[j]; // causes NPE 
      } 
      return stack[j]; 
    } 

    public static void main(String[] args) { 

     MyStackArray X = new MyStackArray(3); 
     //X.setItemAt(0,4); // causes NPE 
     //X.getItemAt(1); // causes NPE 
    X.print();    // causes NPE 
    } 
} 

回答

2
int[] stack = new int [maxSize]; 

在这里,你正在创建一个名为stack新的变量 - 这是不一样的this.stack。你不是想:

stack = new int[maxSize]; // i.e. initialize this.stack, not another variable 

当未初始化,this.stack仍然null,当您尝试访问它,你收到NPE。

P.S.你也用buffer做同样的事情。

1

你没有正确初始化的变量:

public MyStackArray(int s){ 
    maxSize = s; 
    int[] buffer = new int [maxSize]; // Initializes LOCAL buffer 
    int[] stack = new int [maxSize]; // Initializes LOCAL stack 

    for(int i=0; i<maxSize; i++) 
     stack[i]=i; // initiallizing the array with random values. 
} 

变化是这样的:

public MyStackArray(int s){ 
    maxSize = s; 
    buffer = new int [maxSize]; 
    stack = new int [maxSize]; 

    for(int i=0; i<maxSize; i++) 
     stack[i]=i; // initiallizing the array with random values. 
} 
1

你实际上是在你的构造函数初始化新的(本地)阵列。你有

public MyStackArray(int s){ 
    maxSize = s; 
    int[] buffer = new int [maxSize]; //You are declaring new array 
    int[] stack = new int [maxSize]; //You are declaring new array 

    for(int i=0; i<maxSize; i++) 
     stack[i]=i; // initiallizing the array with random values. 
} 

但你应该不是这个在构造函数:

public MyStackArray(int s){ 
    maxSize = s; 
    buffer = new int [maxSize]; 
    stack = new int [maxSize]; 

    for(int i=0; i<maxSize; i++) 
     stack[i]=i; // initiallizing the array with random values. 
}