Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc.

willyk311

Mitglied
Hey Leute, versuche gerade eine Speichern-Funktion für ein Spiel zu implementieren. Das Spiel soll 4 Speicherslots haben, die bei jedem Neustart automatisch geladen werden sollen. Da es nicht ausschließlich um das Spiel geht und es wahrscheinlich an meinen nicht vorhanden Skills liegt, poste ich es mal in diesem Anfänger Thread.
Die Klasse SaveGames unten, soll byte Arrays in einer ArrayList speichern, was dann im SaveGames Objekt auf der Festplatte gespeichert werden soll. Aber irgendwie bekomme ich Nullpointer nachdem ich das Programm neustarte und versuche ein Spiel zu laden oder zu speichern. Wenn es noch keine gespeicherte Datei gibt und ich im Spiel einen Spielstand speicher, dann geht das problemlos auch auf mehreren Indizes auf der ArrayList und der lädt auch ständig die Datei mit um zu testen ob ein Index leer ist.
Wenn ich das Programm neustarte und versuche ein anderes Spiel zu speichern, bekomme ich einen Nullpointer bei `Collections.replaceAll(saves, saves.get(slot), savegame);` Ist das das Problem vielleicht?

Nach dem Neustarten kommt hier der Nuller, wenn ich laden will:

if (SaveGames.getInstance().getSaveGames().get(slot) == null)

Das ist die SaveGames Klasse, könnt ihr da Fehler entdecken?

Code:
    public class SaveGames implements Serializable {

    private static final long serialVersionUID = 1893501111568176741L;

	private static SaveGames instance;

	private static ArrayList<byte[]> saves;

	private static String[] saveNames;

	Date datumHeute = new Date();

	SimpleDateFormat myDateFormat = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss");

	private SaveGames() {
		saves = new ArrayList<byte[]>(4);
		saves.add(0, null);
		saves.add(1, null);
		saves.add(2, null);
		saves.add(3, null);
		saveNames = new String[4];
	}

	public String getSaveName(int slot) {
		return saveNames[slot];
	}

	public ArrayList<byte[]> getSaveGames() {
		return saves;
	}

	public void addSaveGame(byte[] savegame, int slot) {
		Collections.replaceAll(saves, saves.get(slot), savegame);
		saveNames[slot] = ("" + myDateFormat.format(datumHeute));
	}

	public static SaveGames getInstance() {
		if (instance == null) {
			loadFromDrive();
		}
		return instance;
	}

	public void saveToDrive() {
		FileOutputStream b = null;
		try {
			b = new FileOutputStream("save.ser");
			ObjectOutputStream o = new ObjectOutputStream(b);
			o.writeObject(this);
			o.close();
		} catch (IOException ioe) {
		}
	}

	public static void loadFromDrive() {
		FileInputStream b = null;
		try {
			b = new FileInputStream("save.ser");
			ObjectInputStream o = new ObjectInputStream(b);
			instance = (SaveGames) o.readObject();
			o.close();
		} catch (NullPointerException | IOException | ClassNotFoundException e) {
			System.out.println("Class not Found!");
			instance = new SaveGames();
		}
	}
}
 
Also
Java:
Collections.replaceAll(saves, saves.get(slot), savegame);
habe ich ersetzt durch
Java:
saves.set(slot, savegame);

replaceAll, hat alle Slots überschrieben. Nichts destotrotz habe ich noch immer den anderen Fehler.


Sollte man den Thread vielleicht doch zu Spiele verschieben, weil hier nur auf noch einfachere Fragen geantwortet wird?
 
Also
Java:
Collections.replaceAll(saves, saves.get(slot), savegame);
habe ich ersetzt durch
Java:
saves.set(slot, savegame);

replaceAll, hat alle Slots überschrieben. Nichts destotrotz habe ich noch immer den anderen Fehler.


Sollte man den Thread vielleicht doch zu Spiele verschieben, weil hier nur auf noch einfachere Fragen geantwortet wird?

Die Antwort ist wahrscheinlich noch einfacher als die Frage🙂

Java:
SaveGames.getInstance().getSaveGames().get(slot) == null

Ich gehe mal davon aus, dass deine Instance null ist. Wieso setzt du nicht einfach einen Haltepunkt in der loadFromDrive -Methode und debuggst das mal durch!? Kommst sicherlich schneller ans Ziel.

Weiterhin würde ich bei der saveToDrive()- Methode in die Exception was reinschreiben, vllt läuft ja hier auch etwas schief?


Ändere hier mal die catch -Anweisung dahingehend, dass sie vorerst alle Exceptions abfängt.
Java:
public static void loadFromDrive() {
		FileInputStream b = null;
		try {
			b = new FileInputStream("save.ser");
			ObjectInputStream o = new ObjectInputStream(b);
			instance = (SaveGames) o.readObject();
			o.close();
		} catch (NullPointerException | IOException | ClassNotFoundException e) {
			System.out.println("Class not Found!");
			instance = new SaveGames();
		}
	}

....
catch (Exception e) {
                        e.printStackTrace();
			System.out.println("Class not Found!");
			instance = new SaveGames();
		}
...
 
Zuletzt bearbeitet:

Zurück
Oben