diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Konto.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Konto.java index e787df5..01edb47 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Konto.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/domain/Konto.java @@ -73,4 +73,10 @@ public class Konto implements Serializable { return saldo; } + public void rollback() { + Kontobewegung kbw = kontobewegungen.get(kontobewegungen.size()-1); + stand += kbw.getBetrag() *-1; + kontobewegungen.remove(kontobewegungen.size()-1); + } + } diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/Banksystem.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/Banksystem.java index 5ff5144..3129461 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/Banksystem.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/facade/Banksystem.java @@ -1,5 +1,6 @@ package de.hs_mannheim.informatik.bank.facade; +import java.io.IOException; import java.util.Collection; import de.hs_mannheim.informatik.bank.domain.Bank; @@ -10,16 +11,23 @@ import de.hs_mannheim.informatik.bank.infrastructure.Persistenz; public class Banksystem { private Bank bank; - public Banksystem(String bankname) throws Exception { + public Banksystem(String bankname) { if (Persistenz.sindDatenGespeichert(bankname)) - this.bank = (Bank) Persistenz.ladeBankDaten(bankname); - else - this.bank = new Bank(bankname); + try { + this.bank = (Bank) Persistenz.ladeBankDaten(bankname); + + return; + } catch (ClassNotFoundException | IOException e) { + // Hier loggen wir die Exception und starten einfach mit einem leeren System. + System.err.println("Persistierte Daten konnten nicht geladen werden."); + } + + this.bank = new Bank(bankname); } - public int kontoAnlegen(String name, int auswahl) throws Exception { + public int kontoAnlegen(String name, int auswahl) throws IOException { int kontonummer = bank.addKonto(name, auswahl); - + Persistenz.speichereBankDaten(this.bank, bank.getName()); return kontonummer; @@ -41,22 +49,27 @@ public class Banksystem { return bank.getName(); } - public long geldEinzahlen(int kontonummer, long betrag) throws Exception { + public long geldEinzahlen(int kontonummer, long betrag) throws IOException { Konto konto = bank.findeKonto(kontonummer); konto.einzahlen(betrag, "Einzahlung am Schalter", "Einzahlung", konto.getInhaber()); - Persistenz.speichereBankDaten(this.bank, bank.getName()); - + try { + Persistenz.speichereBankDaten(this.bank, bank.getName()); + } catch (IOException ioe) { + konto.rollback(); + throw ioe; + } + return konto.getKontostand(); } - public boolean geldAuszahlen(int kontonummer, long betrag) throws Exception { + public boolean geldAuszahlen(int kontonummer, long betrag) throws IOException { Konto konto = bank.findeKonto(kontonummer); - + boolean erg = konto.auszahlen(betrag, "Auszahlung am Schalter", "Auszahlung", konto.getInhaber()); - + Persistenz.speichereBankDaten(this.bank, bank.getName()); - + return erg; } @@ -73,7 +86,7 @@ public class Banksystem { if (start instanceof Girokonto && ziel instanceof Girokonto) { boolean erfolg = ((Girokonto)start).überweise((Girokonto)ziel, betrag, verwendungszweck); Persistenz.speichereBankDaten(this.bank, bank.getName()); - + return erfolg; } @@ -88,7 +101,7 @@ public class Banksystem { public long saldoBestimmen(int kontonummer, int anzahl) { Konto konto = bank.findeKonto(kontonummer); - + return konto.berechneSaldo(anzahl); } diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/infrastructure/Persistenz.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/infrastructure/Persistenz.java index 5d08e48..aed427e 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/infrastructure/Persistenz.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/infrastructure/Persistenz.java @@ -3,6 +3,7 @@ package de.hs_mannheim.informatik.bank.infrastructure; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -13,13 +14,13 @@ public class Persistenz { return new File(name + BANK_DATEI).exists(); } - public static void speichereBankDaten(Object bank, String name) throws Exception { + public static void speichereBankDaten(Object bank, String name) throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(name + BANK_DATEI)); oos.writeObject(bank); oos.close(); } - public static Object ladeBankDaten(String name) throws Exception { + public static Object ladeBankDaten(String name) throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(name + BANK_DATEI)); Object bank = ois.readObject(); ois.close(); diff --git a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/ui/UI.java b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/ui/UI.java index 3f10d79..024ec5f 100644 --- a/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/ui/UI.java +++ b/Bank-Beispiel/src/de/hs_mannheim/informatik/bank/ui/UI.java @@ -1,5 +1,6 @@ package de.hs_mannheim.informatik.bank.ui; +import java.io.IOException; import java.util.Scanner; import de.hs_mannheim.informatik.bank.facade.Banksystem; @@ -49,7 +50,6 @@ public class UI { case 7: saldoAbfragen(); break; case 9: break mainloop; } - } catch (Exception e) { System.err.println(e.getLocalizedMessage()); } @@ -72,7 +72,7 @@ public class UI { } } - private void kontoAnlegen() throws Exception { + private void kontoAnlegen() throws IOException { System.out.println("Bitte den Namen des Kontoinhabers angeben: "); String name = sc.nextLine(); @@ -83,22 +83,38 @@ public class UI { System.out.println("Konto mit der Nummer " + kontonummer + " neu angelegt."); } - private void geldEinzahlen() throws Exception { - System.out.println("Geld einzahlen"); - System.out.print("Bitte die gewünschte Kontonummer eingeben: "); - int kontonummer = Integer.parseInt(sc.nextLine()); + private void geldEinzahlen() throws IOException { + int kontonummer = 0; + double betrag = 0; + boolean ok = false; - // optional prüfen, ob Konto existiert + do { + System.out.println("Geld einzahlen"); + System.out.print("Bitte die gewünschte Kontonummer eingeben: "); - System.out.print("Bitte den gewünschten Betrag eingeben: "); - double betrag = Double.parseDouble(sc.nextLine()); + try { + kontonummer = Integer.parseInt(sc.nextLine()); + // optional prüfen, ob Konto existiert + } catch (NumberFormatException nfe) { + System.err.println("Kontonummer muss eine Zahl sein, bitte Eingabe wiederholen!"); + continue; + } + + System.out.print("Bitte den gewünschten Betrag eingeben: "); + try { + betrag = Double.parseDouble(sc.nextLine()); + } catch (NumberFormatException nfe) { + System.err.println("Betrag muss eine Kommazahl sein, bitte Eingabe wiederholen!"); + } + + } while(!ok); long neuerKontostand = bs.geldEinzahlen(kontonummer, (long)betrag * 100); System.out.printf("Einzahlung erfolgreich, neuer Kontostand = %.2f Euro", (neuerKontostand / 100.0)); } - private void geldAuszahlen() throws Exception { + private void geldAuszahlen() throws IOException { System.out.println("Geld auszahlen"); System.out.print("Bitte die gewünschte Kontonummer eingeben: "); int kontonummer = Integer.parseInt(sc.nextLine()); @@ -145,14 +161,14 @@ public class UI { System.out.println("Überweisung" + ( (!erfolgreich) ? " nicht" : "") + " erfolgreich ausgeführt."); } - + private void saldoAbfragen() { System.out.print("Bitte die Kontonummer des gewünschten Kontos eingeben: "); int konto = Integer.parseInt(sc.nextLine()); System.out.print("Bitte die Anzahl der Kontobewegungen für den Saldo eingeben: "); int anzahl = Integer.parseInt(sc.nextLine()); - + long saldo = bs.saldoBestimmen(konto, anzahl); System.out.printf("Der Saldo nach %d Kontobewegungen beträgt %.2f Euro.%n", anzahl, (saldo/100d)); }