Java 奇怪的空指针异常

Java 奇怪的空指针异常,java,Java,我正在尝试使用名为stack和buffer的两个堆栈实现一个数组。 最初,堆栈由随机值填充,MyArrayI接口包含两个函数:getItemAt(int-index)和setItemAt(int-index,int-item)。并且它们在MyStackArray类中成功实现。 每当我运行该程序时,我都会得到Null异常错误,我一直试图跟踪原因,直到发现堆栈中没有填充初始数据——可能是这样。 每当我尝试访问堆栈或缓冲区时,就会出现NullPointerException错误。当我试图打印数组堆栈中

我正在尝试使用名为stack和buffer的两个堆栈实现一个数组。 最初,堆栈由随机值填充,MyArrayI接口包含两个函数: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
    }
}
公共类MyStackArray实现MyArrayI{
私有int[]缓冲区;
私有int[]堆栈;
私有int-maxSize;
公共数组(int-s){
maxSize=s;
int[]缓冲区=新的int[maxSize];
int[]堆栈=新int[maxSize];
对于(int i=0;i
在这里,您正在创建一个名为
stack
的新变量-这与
this.stack
不同。您需要:

stack = new int[maxSize];  // i.e. initialize this.stack, not another variable
未初始化时,
this.stack
将保持
null
,当您尝试访问它时,您将收到一个NPE

另外,你也在用
缓冲区做同样的事情

在这里,您正在创建一个名为
stack
的新变量-这与
this.stack
不同。您需要:

stack = new int[maxSize];  // i.e. initialize this.stack, not another variable
未初始化时,
this.stack
将保持
null
,当您尝试访问它时,您将收到一个NPE


另外,您对
缓冲区也做了同样的事情

您没有正确初始化变量:

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;
int[]buffer=new int[maxSize];//初始化本地缓冲区
int[]stack=new int[maxSize];//初始化本地堆栈

对于(int i=0;i您没有正确初始化变量:

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;
int[]buffer=new int[maxSize];//初始化本地缓冲区
int[]stack=new int[maxSize];//初始化本地堆栈

对于(inti=0;i,您实际上是在构造函数中初始化新的(本地)数组

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;
int[]buffer=new int[maxSize];//您正在声明新数组
int[]stack=new int[maxSize];//您正在声明新数组

对于(inti=0;i,您实际上是在构造函数中初始化新的(本地)数组

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;
int[]buffer=new int[maxSize];//您正在声明新数组
int[]stack=new int[maxSize];//您正在声明新数组
对于(int i=0;i