Я пытаюсь загрузить 2D-массив из файла. Я могу сохранить его, используя этот блок кода:NullPointerException from FileInputStream readObject()
// Save the array to a file using ObjectOutputStream
ObjectOutputStream os;
try {
os = new ObjectOutputStream(new FileOutputStream("savestate.dat"));
os.writeObject(playingField);
os.close();
} catch (IOException ex) {
ex.printStackTrace();
}
Я затем попытаться загрузить файл с помощью этого:
// First, load file using ObjectInputStream
ObjectInputStream is = null;
try {
is = new ObjectInputStream(new FileInputStream("savestate.dat"));
} catch (IOException e1) {
e1.printStackTrace();
}
// Then, read object and cast it as EnhancedMinesweeperTile[][]
try {
playingField = (EnhancedMinesweeperTile[][]) is.readObject();
} catch (ClassNotFoundException | IOException e1) {
e1.printStackTrace();
}
Но я получаю NullPointerException при попытке загрузить его:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.awt.Container.updateGraphicsData(Unknown Source)
at java.awt.Container.updateGraphicsData(Unknown Source)
at java.awt.Container.updateGraphicsData(Unknown Source)
at java.awt.Container.updateGraphicsData(Unknown Source)
at java.awt.Container.updateGraphicsData(Unknown Source)
at java.awt.Component.setGraphicsConfiguration(Unknown Source)
at java.awt.Window.setGraphicsConfiguration(Unknown Source)
at java.awt.Window.initGC(Unknown Source)
at java.awt.Window.initDeserializedWindow(Unknown Source)
at java.awt.Window.readObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at java.awt.Component.readObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at EnhancedMinesweeper.actionPerformed(EnhancedMinesweeper.java:316)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
at EnhancedMinesweeper.actionPerformed (EnhancedMinesweeper.java:316) - это строка: playField = (EnhancedMinesweeperTile [] []) is.readObject();
Я знаю, что мой массив не равен нулю. Я инициализируюсь его в качестве элемента данных, как это:
private static EnhancedMinesweeperTile[][] playingField = new EnhancedMinesweeperTile[10][10]; // initialize a 2D array of Tiles
И затем позже я инициализировать каждый и каждый элемент, как это:
for (int i = 0; i < 10; i++){
for (int j = 0; j < 10; j++){
playingField[i][j] = new EnhancedMinesweeperTile(i, j);
}
}
Что не так с этим? Почему я могу сохранить его в файл, но тогда я не могу загрузить его из файла? Это сводит меня с ума.
Почему вы отключили сообщение об ошибке? –
Либо есть еще одно исключение перед «NullPointerException», которое приводит к 'is', все еще являющемуся« null ». Если моя ставка неверна, проверьте методы Serialization в EnhancedMinesweeperTile. Более подробную информацию можно узнать только в том случае, если вы добавили недостающие строки из трассировки стека. –
Инициализатор массива не имеет значения после назначения, поэтому он все равно может быть пустым - если 'is.readObject()' возвращает значение null. – ash