1

我正在尝试使用 2 个名为 stack 和 buffer 的堆栈来实现一个数组。最初堆栈填充随机值,MyArrayI 接口包含 2 个函数:getItemAt(int index) 和 setItemAt(int index, int item)。并且它们在 MyStackArray 类中成功实现。每当我运行程序时,我都会收到 Null 异常错误,我试图追踪原因,直到我发现堆栈没有填充初始数据 - 也许。每当我尝试访问堆栈或缓冲区时,我都会收到 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
    }
}
4

3 回答 3

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。

PS你也在做同样的事情buffer

于 2013-03-24T22:42:17.260 回答
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.
}
于 2013-03-24T22:48:43.500 回答
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.
}
于 2013-03-24T22:42:50.270 回答