1

stackとbufferという名前の2つのスタックを使用して配列を実装しようとしています。最初、スタックはランダムな値で満たされます。MyArrayIインターフェイスには、getItemAt(int index)とsetItemAt(int index、int item)の2つの関数が含まれています。そして、それらは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]; // 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 に答える
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 に答える