Alle möglichen Error Möglichkeiten abfangen

Also ich hatte mir einfach mal zur Übung selbst eine Aufgabe gestellt :) Ich wollte einen Bankautomaten coden :)

Meine Frage wäre, findet jemand vielleicht noch eine Sicherheitslücke in meinem Code :)

Bank Klasse:
Java:
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Scanner;

public class Bank {
    @SuppressWarnings("resource")
    int BankID;
    String Bankname;
    ArrayList <Konto> Database = new ArrayList <Konto>();
    
    Bank(String name){
        this.BankID = 123456789;
        this.Bankname = name;
    }
    
    void createAccount() {
        Scanner sc = new Scanner(System.in);
        Konto acc = new Konto();
        System.out.println("Geben sie den Kontoinhaber ein: ");
        acc.Kontoinhaber = sc.nextLine();
        System.out.println("Geben sie ihre gewünschte Kontonummer ein: ");
        acc.Kontonummer = Integer.parseInt(sc.nextLine());
        acc.Kontostand = 0;
        Database.add(acc);
        System.out.println("Ihr Konto wurde erfolgreich erstellt.");
    }
    
    void closeAccount(int id) {
        ListIterator<Konto> run = Database.listIterator();
        Konto temp;
        while(run.hasNext()) {
            temp = run.next();
            if(temp.Kontonummer == id) {
                run.remove();
                break;
            }
        }
        System.out.println("Ihr Konto wurde erfolgreich aufgelöst.");
    }
    
    int checkBalance(int id) {
        ListIterator<Konto> run = Database.listIterator();
        Konto temp;
        while(run.hasNext()) {
            temp = run.next();
            if(temp.Kontonummer == id) {
                return temp.Kontostand;
            }
        }
        return -1;
    }
    
    void withdraw(int id) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Geben sie den Betrag ein, welchen sie abheben wollen: ");
        int money = Integer.parseInt(sc.nextLine());
        ListIterator<Konto> run = Database.listIterator();
        Konto temp = new Konto();
        while(run.hasNext()) {
            temp = run.next();
            if(temp.Kontonummer == id) {
                temp.Kontostand = temp.Kontostand - money;
            }else {
                return;
            }
        }
        System.out.println("Der Betrag wurde erfolgreich ausgezahlt. Ihr verbleibendes Guthaben beträgt " + temp.Kontostand + " $.");
        
    }
    
    void deposit(int id) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Geben sie den Betrag ein, welchen sie einzahlen wollen: ");
        int money = Integer.parseInt(sc.nextLine());
        ListIterator<Konto> run = Database.listIterator();
        Konto temp = new Konto();
        while(run.hasNext()) {
            temp = run.next();
            if(temp.Kontonummer == id) {
                temp.Kontostand = temp.Kontostand + money;
            }
        }
        System.out.println("Der Betrag wurde erfolgreich eingezahlt. Ihr verbleibendes Guthaben beträgt " + temp.Kontostand + " $.");
    }
}
Konto Klasse:

Java:
public class Konto {

    public int Kontostand;
    public int Kontonummer;
    public String Kontoinhaber;
    
    
}
Test Klasse:

Java:
import java.util.Scanner;

public class Testing {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Bank banking = new Bank("Postbank");
        String check = "";
        
        while(!(check.equals("Nein"))) {
            System.out.println("Welche Aktion wollen sie ausführen?  Geld einzahlen(1), Geld abheben(2), Kontostand abrufen(3), "
                    + "Neues Konto eröffnen(4), Konto schließen(5)");
            int mode = Integer.parseInt(sc.nextLine());
            if(sc.hasNextInt()) {
            
                switch(mode) {
                
                case 1:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    int num1 = Integer.parseInt(sc.nextLine());
                    if(sc.hasNextInt()) {
                        banking.deposit(num1);
                    }else {
                        System.out.println("Error! Das ist keine Zahl");
                    }
                    
                    break;
                case 2:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    int num2 = Integer.parseInt(sc.nextLine());
                    if(sc.hasNextInt()) {
                        banking.withdraw(num2);
                    }else {
                        System.out.println("Error! Das ist keine Zahl");
                    }
                    break;
                case 3:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    int num3 = Integer.parseInt(sc.nextLine());
                    if(sc.hasNextInt()) {
                        System.out.println(banking.checkBalance(num3));
                    }else {
                        System.out.println("Error! Das ist keine Zahl");
                    }
                    break;
                case 4:
                    banking.createAccount();
                    break;
                case 5:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    int num4 = Integer.parseInt(sc.nextLine());
                    if(sc.hasNextInt()) {
                        banking.closeAccount(num4);
                    }else {
                        System.out.println("Error! Das ist keine Zahl");
                    }
                    break;
                }
                
                System.out.println("Wollen sie eine weiter Aktion durchführen? Geben sie Ja oder Nein ein.");
                check = sc.nextLine();
            }else {
                System.out.println("Error! Das ist keine Zahl");
            }
        }

    }

}
 
Naja also alles Mögliche was schief laufen könnte, einfach Dinge die mein Code nicht abfängt :) Und wenn ihr Tipps zu meinem Code habt, wie man Dinge effizienter macht, ebenfalls gerne her damit :)
 
Was mir auffällt:

a) Die Naming Standards sind nicht eingehalten. Variablen sollten immer klein Anfangen.

b) Erstellung eines neuen Kontos ist unnötig z.B. in withdraw:
Java:
        Konto temp = new Konto();
        while(run.hasNext()) {
            temp = run.next();
Du willst doch nur die existierenden Konten durchgehen, also macht es keinen Sinn, da ein neues Konto zu erstellen.

c) Egal ob ein Konto gefunden wurde oder nicht: Es kommt eine positive Rückmeldung? Da macht es Spaß, Geld abzuheben.
Damit verbunden: Die Logik ist komplett falsch:
Java:
        while(run.hasNext()) {
            temp = run.next();
            if(temp.Kontonummer == id) {
                temp.Kontostand = temp.Kontostand - money;
            }else {
                return;
            }
Also solange es noch Konten gibt:
- temp soll das nächste Konto sein: Also jetzt das erste Konto.
- Dann prüft er: Ist das Konto das richtige? Mal angenommen, das wäre der Fall: Der Kontostand wird angepasst.
--> Ende der Schleife, mal angenommen, es gibt noch mehr Konten:
- temp ist nun das nächste Konto
- Kontonummer ist nun unterschiedlich: Er springt also zurück -> Keine Ausgabe!

Angenommen, das erste Konto ist schon nicht das gesuchte Konto: Dann springt er sofort zurück.

Der Code macht also nur das, was Du erwartest, wenn es nur genau ein Konto gibt und das auch noch das gesuchte Konto ist.

d) Den Fall, dass ein Konto nicht existiert, sehe ich nicht. Das sollte doch auch angezeigt werden, oder?

e) Viel doppelter Code. Wenn Du code Mehrfach hast, dann steck ihn doch in eine Methode und ruf diese auf.

f) Ganz viele Scanner ... das ist neben main die zweite Ausnahme, wo ich ein static durchaus ok finde. Also z.B. ein public static Scanner SCANNER = new Scanner(System.in); in einer Klasse und dann wird diese Instanz immer genutzt ....

g) Nett wäre noch: Du fängst ja schon an, in Klassen zu arbeiten. Wie wäre es denn, wenn Du die Kontenverwaltung in einer Klasse Kapseln würdest? Dann hättest Du da nur noch die gewünschte Methoden drauf - das ist aber nur eine Idee.
 
Was mir auffällt:
a) Die Naming Standards sind nicht eingehalten. Variablen sollten immer klein Anfangen.
Ich werde das mal korrigieren :)

b) Erstellung eines neuen Kontos ist unnötig z.B. in withdraw:
Java:
        Konto temp = new Konto();
        while(run.hasNext()) {
            temp = run.next();
Du willst doch nur die existierenden Konten durchgehen, also macht es keinen Sinn, da ein neues Konto zu erstellen.
Naja also ich würde halt im Print eine Fehlermeldung bekommen, dass temp nicht initialisiert wurde :( Ich versuche mal den Fall mit keinem passenden Konto einzufügen

Edit: ich habe doch den Case abgedeckt, falls es keinen Match gibt :) Nur keine Print Meldung dazu verfasst :)

Java:
while(run.hasNext()) {
            temp = run.next();
            if(temp.Kontonummer == id) {
                temp.Kontostand = temp.Kontostand - money;
            }else {
                return; // <----- Wenn kein Match
            }
        }
 
Warum bricht das Programm hiernach ab und es wird nichts mehr ausgeführt, wenn ich doch Zahlen von 1-5 eingebe ?

Java:
int mode = Integer.parseInt(sc.nextLine());
            System.out.println(mode);
            if(sc.hasNextInt()) {
                switch(mode) {
 
Es scheint am der while schleifen Bedingung zu liegen jedoch verstehe ich nicht ganz genau was er von mir möchte

Edit: Hat nichts damit zu tun, irgendwie muss ich die Zahlen doppelt eingeben bis der switch reagiert...Ich habe ehrlich gesagt keinen Schimmer woran es liegt xD

Hier ist meine aktuelle Testing Klasse:
Java:
import java.util.Scanner;

public class Testing {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Bank banking = new Bank("Postbank");
        String check = "";
        
        while(!(check.equals("Nein"))) {
            System.out.println("Welche Aktion wollen sie ausführen?  Geld einzahlen(1), Geld abheben(2), Kontostand abrufen(3), "
                    + "Neues Konto eröffnen(4), Konto schließen(5)");
            int mode = Integer.parseInt(sc.nextLine());
            System.out.println(mode);
            System.out.println(sc.hasNextInt());
            if(sc.hasNextInt()) {
                switch(mode) {
                case 1:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    int num1 = Integer.parseInt(sc.nextLine());
                    if(sc.hasNextInt()) {
                        banking.deposit(num1);
                    }else {
                        System.out.println("Error! Das ist keine Zahl");
                    }
                    
                    break;
                case 2:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    int num2 = Integer.parseInt(sc.nextLine());
                    if(sc.hasNextInt()) {
                        banking.withdraw(num2);
                    }else {
                        System.out.println("Error! Das ist keine Zahl");
                    }
                    break;
                case 3:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    int num3 = Integer.parseInt(sc.nextLine());
                    if(sc.hasNextInt()) {
                        System.out.println(banking.checkBalance(num3));
                    }else {
                        System.out.println("Error! Das ist keine Zahl");
                    }
                    break;
                case 4:
                    banking.createAccount();
                    break;
                case 5:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    int num4 = Integer.parseInt(sc.nextLine());
                    if(sc.hasNextInt()) {
                        banking.closeAccount(num4);
                    }else {
                        System.out.println("Error! Das ist keine Zahl");
                    }
                    break;
                default:
                    System.out.println("Error");
                    break;
                }
            }else {
                System.out.println("Error! Das ist keine Zahl");
            }
                System.out.println("Wollen sie eine weiter Aktion durchführen? Geben sie Ja oder Nein ein.");
                check = sc.nextLine();
        }

    }

}
 
Zuletzt bearbeitet:
Edit: ich habe doch den Case abgedeckt, falls es keinen Match gibt :) Nur keine Print Meldung dazu verfasst :)

Java:
while(run.hasNext()) {
            temp = run.next();
            if(temp.Kontonummer == id) {
                temp.Kontostand = temp.Kontostand - money;
            }else {
                return; // <----- Wenn kein Match
            }
        }
Nein. In der Beschreibung habe ich diesen Fall auch beschrieben: "Angenommen, das erste Konto ist schon nicht das gesuchte Konto: Dann springt er sofort zurück."

Also stell den Fall nach:
Zwei Konten: 1 und 2.
Dann fügst Du beiden Konten Geld hinzu.

==> Bei einem Fall wird es nicht klappen, da das erste Konto nicht das gesuchte ist und er daher sofort abbricht.
==> Bei dem anderen Fall wird es klappen, aber die Ausgabe stimmt nicht, da er das erste Konto anpasst, dann kommt er zum zweiten Konto und da geht er dann in das return so dass keine Ausgabe kommt.

Es gibt ein paar 08/15 Pattern, die immer wieder benutzt werden:
1) Etwas für alle Elemente machen:
Code:
Für jedes Element einer Menge
--> Element bearbeiten
Das <Element bearbeiten> kann dann auch in Form einer if / else Anweisung vorhanden sein. Wichtiges Merkmal hierbei ist: Es wird (in der Regel) nicht abgesprungen, also kein return oder break!

2) Ein Element aus einer Menge bearbeiten oder suchen:
Code:
Für jedes Element einer Menge
--> Ist das Element das gesuchte? Dann Element bearbeiten und return.

Aktion, wenn Element nicht gefunden.
Hier ist wichtig: Die Aktion für Element nicht gefunden ist außerhalb der Schleife!

Tipp: Wenn Du am Anfang Probleme hast, sowas zu überblicken: Mach die Methoden kleiner!

Dann könnte z.B. die Methode so aussehen:
Java:
    void withdraw(int id) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Geben sie den Betrag ein, welchen sie abheben wollen: ");
        int money = Integer.parseInt(sc.nextLine());
        
        Konto gesuchtesKonto = findeKonto(Database, id);
        if (gesuchtesKonto == null) {
            // behandlung von "Konto nicht gefunden" Fall
            return; // Abbruch der Methode.
        }
        
        gesuchtesKonto.Kontostand = gesuchtesKonto.Kontostand - money;
        System.out.println("Der Betrag wurde erfolgreich ausgezahlt. Ihr verbleibendes Guthaben beträgt " + gesuchtesKonto.Kontostand + " $.");   
    }
Und das findeKonto ist dann einfach sowas:
Java:
public static Konto findeKonto(List<Konto> kontoListe, int kontoNummer) {
    for(Konto konto: kontoListe) {
        if (konto.Kontonummer == kontoNummer) return konto;
    }
    return null;
}
Falls du das verwendete for each nicht kennst, kannst Du es auch gerne per Iterator oder normaler for schleife lösen - so eine Schleife hast Du ja schon mitbekommen.

Aber erst einmal ist wichtig, dass Du den Fehler des aktuellen Codes verstehst, damit Du auch die Lösung verstehen kannst. Das Verständnis, das ein if/else in der while Schleife falsch ist, wenn Du für ein Element etwas machen willst, ist in meinen Augen wichtig!
 
Soweit so gut, jedoch verstehe ich trotzdem dass Problem nicht was in der Testklasse falsch läuft :( Aus irgendeinem Grund muss ich eingaben doppelt tätigen bis etwas passiert
 
Und nun zu dem anderen Code. Kannst Du einmal beschreiben, was Du hier machen willst?
Java:
            int mode = Integer.parseInt(sc.nextLine());
            System.out.println(mode);
            System.out.println(sc.hasNextInt());
            if(sc.hasNextInt()) {
Also in der ersten Zeile liest Du eine ganze Zeile und parst diese in einen Integer. Da gibt es zwei Fälle:
a) In der Zeile stand eine Zahl, die in einen Int geparst werden konnte -> Dann hast Du in mode eine gültige Zahl.
b) Es ist keine gültige Zahl eingegeben worden, dann wirft Integer.parseInt eine Exception und da du diese nicht abfängst, wird das Programm beendet.

Dann - nachdem Du in mode schon eine gültige Zahl hast - fragst Du ab, ob ein int am Scanner anliegt? Du hast doch bereits eine gültige Zahl in mode!
 
Und nun zu dem anderen Code. Kannst Du einmal beschreiben, was Du hier machen willst?
Java:
            int mode = Integer.parseInt(sc.nextLine());
            System.out.println(mode);
            System.out.println(sc.hasNextInt());
            if(sc.hasNextInt()) {
Also in der ersten Zeile liest Du eine ganze Zeile und parst diese in einen Integer. Da gibt es zwei Fälle:
a) In der Zeile stand eine Zahl, die in einen Int geparst werden konnte -> Dann hast Du in mode eine gültige Zahl.
b) Es ist keine gültige Zahl eingegeben worden, dann wirft Integer.parseInt eine Exception und da du diese nicht abfängst, wird das Programm beendet.

Dann - nachdem Du in mode schon eine gültige Zahl hast - fragst Du ab, ob ein int am Scanner anliegt? Du hast doch bereits eine gültige Zahl in mode!
Ich möchte halt einen Int einlesen und wenn ich einen korrekten Int eingebe, muss ich trotzdem den Int nocheinmal eingeben bevor überhaupt etwas passiert.

Wie könnte man diesen Fall besser abfangen ? mit try catch?
 
Zuletzt bearbeitet:
Ich habe Dir ja schon mehrfach geraten, so Dinge in eine Methode auszulagern.

Daher wäre sowas möglich:
Java:
public final static Scanner SCANNER = new Scanner(System.in);

public static Integer getUserChoice() {
    try {
        return Integer.parseInt(SCANNER.getLine());
    } catch (NumberFormatException ex) {
        // Logging wäre noch interessant ...
        return null;
    }
}
Ist ungetestet und ich habe da auch nicht zu sehr drüber nachgedacht. Aber das wäre jetzt:
a) Scanner ist in einer public static Variable, damit alle diese Scanner-Instanz nutzen können => Nur ein Scanner auf System.in!
b) Eine Methode, die ein Integer zurück gibt. Integer hat den Vorteil gegenüber int, dass null zurück gegeben werden kann.
c) Es wird nun eine Zeile gelesen und die Eingabe direkt in ein int umgewandelt und diese zurück gegeben.
Wenn die Zahl nicht in eine Zahl übersetzt werden konnte, dann wird null zurück gegeben.

Damit kannst Du dann etwas bauen wie:
Java:
switch(getUserChoice()) {
  case 0: // ....
      break;

  case 1: // ....
      break;

  default:
      System.out.println("Eingabe ungültig. Bitte erneut probieren!");
}
Also wirklich immer möglichst kleine, übersichtliche Methoden schreiben, diese ausprobieren und so austesten. So lernt man aus meiner Sicht am besten.
 
Ich habe Dir ja schon mehrfach geraten, so Dinge in eine Methode auszulagern.

Daher wäre sowas möglich:
Java:
public final static Scanner SCANNER = new Scanner(System.in);

public static Integer getUserChoice() {
    try {
        return Integer.parseInt(SCANNER.getLine());
    } catch (NumberFormatException ex) {
        // Logging wäre noch interessant ...
        return null;
    }
}
Ist ungetestet und ich habe da auch nicht zu sehr drüber nachgedacht. Aber das wäre jetzt:
a) Scanner ist in einer public static Variable, damit alle diese Scanner-Instanz nutzen können => Nur ein Scanner auf System.in!
b) Eine Methode, die ein Integer zurück gibt. Integer hat den Vorteil gegenüber int, dass null zurück gegeben werden kann.
c) Es wird nun eine Zeile gelesen und die Eingabe direkt in ein int umgewandelt und diese zurück gegeben.
Wenn die Zahl nicht in eine Zahl übersetzt werden konnte, dann wird null zurück gegeben.

Damit kannst Du dann etwas bauen wie:
Java:
switch(getUserChoice()) {
  case 0: // ....
      break;

  case 1: // ....
      break;

  default:
      System.out.println("Eingabe ungültig. Bitte erneut probieren!");
}
Also wirklich immer möglichst kleine, übersichtliche Methoden schreiben, diese ausprobieren und so austesten. So lernt man aus meiner Sicht am besten.
Ok Dankeschön :) Ich werde meine Methoden mal etwas aufsplittern :)
 
Ich habe jetzt einfach mal nur das einlesen, so wie du es geschrieben hast in eine Methode gesteckt, jedoch ist das Problem immernoch da...Wenn ich etwas eingebe passiert nichts, beim zweiten eingeben wird eine Methode aufgerufen :( Woran könnte das liegen?

Edit: Ich entschuldige meine Dummheit...ich hatte die Abfrage übersehen mit hasNextInt :( Nur aus reiner Neugier, warum funktioniert es mit hasNextInt nicht ?
 
So ich habe alles so gut es geht angepasst, das sind meine fertigen Dateien:
Java:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Bank {
    @SuppressWarnings("resource")
    int BankID;
    String Bankname;
    ArrayList <Konto> Database = new ArrayList <Konto>();
    
    Bank(String name){
        this.BankID = 123456789;
        this.Bankname = name;
    }
    public final static Scanner sc = new Scanner(System.in);
    
    public static Integer getUserChoice() {
        try {
            return Integer.parseInt(sc.nextLine());
        } catch (NumberFormatException ex) {
            // Logging wäre noch interessant ...
            return null;
        }
    }
    
    void createAccount() {
        Konto gesuchtesKonto = new Konto();
        System.out.println("Geben sie den Kontoinhaber ein: ");
        gesuchtesKonto.kontoinhaber = sc.nextLine();
        System.out.println("Geben sie ihre gewünschte Kontonummer ein: ");
        int id = getUserChoice();
        if(findAccount(Database, id) != null) {
            System.out.println("Dieses Konto existiert bereits!");
            return;
        }
        gesuchtesKonto.kontonummer = id;
        gesuchtesKonto.kontostand = 0;
        Database.add(gesuchtesKonto);
        System.out.println("Ihr Konto wurde erfolgreich erstellt.");
    }
    
    void closeAccount(int id) {
        Konto gesuchtesKonto = findAccount(Database, id);
        if(gesuchtesKonto == null) {
            System.out.println("Dieses Konto existiert nicht!");
            return;
        }
        Database.remove(gesuchtesKonto);
        System.out.println("Ihr Konto wurde erfolgreich aufgelöst.");
    }
    
    Integer checkBalance(int id) {
        Konto gesuchtesKonto = findAccount(Database, id);
        if(gesuchtesKonto != null) {
            return gesuchtesKonto.kontostand;
        }
        System.out.println("Dieses Konto existiert nicht!");
        return null;
    }
    
    void withdraw(int id) {
        System.out.println("Geben sie den Betrag ein, welchen sie abheben wollen: ");
        int money = getUserChoice();
        Konto gesuchtesKonto = findAccount(Database, id);
        if (gesuchtesKonto == null) {
            System.out.println("Dieses Konto existiert nicht!");
            return;
        }
        gesuchtesKonto.kontostand = gesuchtesKonto.kontostand - money;
        System.out.println("Der Betrag wurde erfolgreich ausgezahlt. Ihr neuer Kontostand beträgt " + gesuchtesKonto.kontostand + " $.");   
    }
    
    void deposit(int id) {
        System.out.println("Geben sie den Betrag ein, welchen sie einzahlen wollen: ");
        int money = getUserChoice();
        Konto gesuchtesKonto = findAccount(Database, id);
        if(gesuchtesKonto == null) {
            System.out.println("Dieses Konto existiert nicht!");
            return;
        }
        gesuchtesKonto.kontostand = gesuchtesKonto.kontostand + money;
        System.out.println("Der Betrag wurde erfolgreich eingezahlt. Ihr neuer Kontostand beträgt " + gesuchtesKonto.kontostand + " $.");
    }
    
    void getAccountDetails(int id) {
        Konto gesuchtesKonto = findAccount(Database, id);
        if(gesuchtesKonto == null) {
            System.out.println("Dieses Konto existiert nicht!");
            return;
        }
        System.out.println("Kontoinhaber: " + gesuchtesKonto.kontoinhaber);
        System.out.println("Kontonummer: " + gesuchtesKonto.kontonummer);
        System.out.println("Kontostand: " + gesuchtesKonto.kontostand + "$");
    }
    
    public static Konto findAccount(List<Konto> kontoListe, int kontoNummer) {
        for(Konto konto: kontoListe) {
            if (konto.kontonummer == kontoNummer) {return konto;};
        }
        return null;
    }
}
Java:
public class Konto {
    public int kontostand;
    public int kontonummer;
    public String kontoinhaber;
}
Java:
import java.util.Scanner;

public class Testing {

    public static final Scanner sc = new Scanner(System.in);
    
    public static Integer getUserChoice() {
        try {
            return Integer.parseInt(sc.nextLine());
        } catch (NumberFormatException ex) {
            // Logging wäre noch interessant ...
            return null;
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Bank banking = new Bank("Postbank");
        String check = "";
        
        while(!(check.equals("Nein"))) {
            System.out.println("Welche Aktion wollen sie ausführen?  Geld einzahlen(1), Geld abheben(2), "
                    + " Zeige Kontoinformationen(3), " + "Neues Konto eröffnen(4), Konto schließen(5)");
                
            switch(getUserChoice()) {
                case 1:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    banking.deposit(getUserChoice());
                    break;
                case 2:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    banking.withdraw(getUserChoice());
                    break;
                case 3:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    banking.getAccountDetails(getUserChoice());
                    break;
                case 4:
                    banking.createAccount();
                    break;   
                case 5:
                    System.out.println("Geben sie ihre Kontonummer ein: ");
                    banking.closeAccount(getUserChoice());
                    break;
                default:
                    System.out.println("Error! Input was false!");
                    break;
                }
            
            System.out.println("Wollen sie eine weiter Aktion durchführen? Geben sie Ja oder Nein ein.");
            check = sc.nextLine();
        }
    }
}
Ich überlege gerade noch wie ich beispielsweise eine Bankkarte implementiere, dass man diese "in den Automaten schiebt" und sozusagen die Kontonummer solange gleich bleibt, bis die Karte ausgeworfen wurde
 
@Kirby_Sike
Auch wenn es eventuell verfrüht ist, würde ich an deiner Stelle ein Builder für jeweilige Angelegenheit benutzen. Viel übersichtlicher, wie ich finde. Zudem lass es, in Methoden der Klassen Scanner einzubauen. Viel besser ist es, im Main-Menü die Abfragen zu tätigen, weil eben irgendwann hast du eine GUI dazu gebaut, dann lässt sich diese ohne großen Aufwand in den Code einbinden.
Ist schwer, alle wissen es.

Java:
public class BankDemo
{

    public static void main(String[] args)
    {
        Address address = new Address.AddressBuilder()
            .street("Patternstreet")
            .house(44).city("Patterncity")
            .zip(23265)
            .build();
        LocalDate localDate = LocalDate.of(1980, Month.MARCH, 22);
        CustomerData customerData = new CustomerData.CustomerDataBuilder()
            .firstName("Pat")
            .secondname("Bat")
            .gender("m")
            .birthdate(localDate)
            .address(address)
            .build();
        Customer customer = new Customer(customerData);
        BankCustomer bankCustomer = new BankCustomer(customer, false);
        Bank bank = new Bank();
        bank.addBankCustomer(bankCustomer);
    }

}
Zum Builder: Effective Java, 2nd Edition, sollte an jeder Ecke für Lau zu haben sein, da bereits eine Neue Edition draußen. Ich lege dir das Buch ans Herz!
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben