2013-03-24 3 views
1

Я пытаюсь реализовать массив, используя 2 стека с именем stack и buffer. Первоначально стек заполняется случайными значениями, интерфейс MyArrayI содержит 2 функции: getItemAt (индекс int) и setItemAt (int index, int item). и они успешно реализованы в классе MyStackArray. всякий раз, когда я запускаю программу, я получаю ошибку исключения Null, я попытался проследить причину, пока не обнаружил, что стек не заполнен исходными данными - может быть. всякий раз, когда я пытаюсь получить доступ к стеку или буфере, я получаю ошибку NullPointerException. и когда я пытаюсь напечатать элементы внутри массива, я все равно получаю глупую ошибку NPE !!!weird Null Pointer Exception

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. 
}