Почему я получаю исключение NullPointerException с массивами в Java? - PullRequest
0 голосов
/ 01 марта 2012
public static byte[] main_Mem = new byte[2048];
public static SlotNode[] cache = new SlotNode[8];

Разве это не создает экземпляры объектов?Зачем мне получать NPE?

 //initialize main memory
           for (int i = 0; i<main_Mem.length; i++) {
                   main_Mem[i] = (byte) (0xFF & i);
                   System.out.printf("%X", 0xFF & i);
                   System.out.print("      " + i);
                   System.out.println(" ");

           }

           //initialize cache slots to 0
           for (int i = 0; i<cache.length; i++) {
                   cache[i].setValidBit(0);
                   cache[i].setTag(0);
                   cache[i].setData(0);
                   cache[i].setDirty(0);
           }

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

Вам нужно инициализировать SlotNode, например:

   for (int i = 0; i<cache.length; i++) {
           cache[i] = new SlotNode(...); // Add the constructor parameters as needed
           cache[i].setValidBit(0);
           cache[i].setTag(0);
           cache[i].setData(0);
           cache[i].setDirty(0);
   }

Делая это:

public static SlotNode[] cache = new SlotNode[8];

вы просто инициализируете массив из 8 SlotNode экземпляров - вам нужно инициализировать каждый из них отдельно.

3 голосов
/ 01 марта 2012

Нет, выделение памяти для массивов - это не то же самое, что выделение объектов.

Кэш массива содержит 8 ссылок типа SlotNode, все из которых имеют нулевое значение, пока вы не назначите их для указания на экземпляр SlotNode.

1 голос
/ 01 марта 2012

Это:

new SlotNode[8]

Создает только массив из 8 SlotNode ссылок. Все они по умолчанию инициализированы на null, поэтому вам придется инициализировать их позже. Например, в цикле:

for (int i = 0; i<cache.length; i++) {
    cache[i] = new SlotNode(); // initialize the object
    cache[i].setValidBit(0);
    cache[i].setTag(0);
    cache[i].setDirty(0);
}
...