Input/Output Probleme bei der Deserialisierung von arrayList

studentHAW

Neues Mitglied
Hallo , ich bin Student und habe seit diesem Semester Objektorientiertes Programmieren mit Java.
Das Thema ist Serialisierung.

Wir haben ein Projekt, die anscheinend beliebte Bankaufgabe, und sollen zwei ArrayLists serialisieren und danach wieder deserialisieren.

Die eine funktioniert, die andere komischerweise nicht, obwohl ich den gleichen Code-Ablauf benutze.
Der einzige Unterschied ist, dass in der einen ArrayList Objekte einer Klasse zusammengefasst sind, in denen Hashmaps benutzt werden. Könnte da vielleicht das Prolem liegen?

Ich habe also eine Klasse Bank mit den Methoden backup und restore

Java:
	public void backup(String filename) {
		try {
			FileOutputStream filestream = new FileOutputStream(filename);
			ObjectOutputStream os = new ObjectOutputStream(filestream);
			//os.writeObject(accounts);
			os.writeObject(depots);
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void restore(String filename) {

		FileInputStream filestream;

		try {
			filestream = new FileInputStream(filename);
			ObjectInputStream is = new ObjectInputStream(filestream);
			
			//Object Obj1 = is.readObject();
			Object Obj2 = is.readObject();
			//accounts = (ArrayList<Account>) Obj1;

			depots = (ArrayList<Depot>) Obj2;

			is.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

ich versuche die ArrayList depots zu serialisieren, in depots sind Objekte der Klasse Depot, die folgendermaßen aussieht:

Java:
package bank_aufgabe;

import java.io.Serializable;
import java.util.HashMap;

public class Depot implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Account account;
	private Customer owner;
	private HashMap<Stock, Integer> stocksOwned;

	public Depot(Account account) {
		this.account = account;
		this.owner = this.account.getOwner();
		stocksOwned = new HashMap<Stock, Integer>();

	}

	public Customer getOwner() {
		return owner;
	}

	public void buy(Stock stock, int amount) {
		if (amount * stock.getValue() < account.getBalance()) {
			account.withdraw("new stock", amount * stock.getValue());
			if (stocksOwned.containsKey(stock)) {
				stocksOwned.put(stock, (amount + stocksOwned.get(stock)));
			} else {
				stocksOwned.put(stock, amount);
			}
		} else {

			throw new BankException("Nicht genug Guthaben!", account.getOwner());
		}
	}

	public void sell(Stock stock, int amount) {
		if (stocksOwned.containsKey(stock) == true) {
			if (amount > stocksOwned.get(stock)) {
				account.deposit(stock.toString() + "verkauft", stock.getValue()
						* stocksOwned.get(stock));
				stocksOwned.remove(stock);
			} else {
				account.deposit(stock.toString() + "verkauft", stock.getValue()
						* amount);
				stocksOwned.put(stock, (stocksOwned.get(stock)) - amount);

			}
		} else {
			throw new BankException(String.format("Aktie ist nicht im Depot: %s",
					stock.getName()), account.getOwner());
		}
	}
	
	public String toString(){
		//TODO was cooles ausdenken, ich hab mich da verrant -.-
		return "hallo";
		
	}
}

Ich bekomme eine Nullpointer-Exception wenn ich versuche auf ein Depot zuzugreifen:

Java:
 System.out.println(myBank.getDepot(1).toString());



Hat jemand vielleicht einen Tipp wo mein Fehler ist ?

MfG Kilian
 
Zuletzt bearbeitet:

njans

Top Contributor
Java:
System.out.println(myBank.getDepot(1).toString());

Wieso getDepot(1) ?
Hast du mal geguckt, ob überhaupt Depots geladen werden?
Implementieren alle Klassen in Depot ebenfalls Serializable?
 

studentHAW

Neues Mitglied
Die Bank hat Konten, die haben ne Klassenvariable kundennummer ... anhand dieser Kundennummer kann man mit getDepot ein Depot aufrufen dass zu einer Kundennummer gehört ... in meinem Beispiel haben ich halt dem Kunden mit der Kundennummer 1 ein Depot erstellt und ein paar Aktien darin gespeichert.

Alle Klassen in Depot implementieren Serializable.

Ich hab jetzt mal geguckt ob Depots geladen werden -> sie werden geladen.

Und dann hab ich auch meinen Fehler gefunden.
Ich hatte mir manuell ein Objekt vom Typ Depot erstellt und als Eigentümer einen Kunden der Bank eingetragen. Dieses Depot war dann aber natürlich nicht in der ArrayList depots der Bank vorhanden und wurde demzufolge auch nicht weggespeichert.
Nun funktioniert aber alles prächtig.

Vielen Dank für die schnelle Antwort und den Tipp. Tut mir Leid dass ich mit so einem blöden Fehler hier rumnerven musste ._.
 
Zuletzt bearbeitet:

Neue Themen


Oben