Alle möglichen Error Möglichkeiten abfangen

Kirby.exe

Top Contributor
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!
 
Werde ich nach der Klausurenphase in Angriff nehmen und lesen 🙂

Könntest du mir die Mathe, Python und Java Ordner vielleicht in eine ZIP Datei packen und irgendwie auf workupload hochladen? 😀
 
in eine ZIP Datei packen und irgendwie auf workupload hochladen
Wäre laut Vereinbarung eine Straftat. Nichts für ungut, aber die besagten Bücher habe ich größtenteils erworben und das Weitergeben ist laut AGBs untersagt und wird geahndet. Den Rest habe ich mir hier und da für Lau geladen und hier ist der heiße Tipp: komm öfter mal vorbei, ab und an postet mal der oder die andere, aber eher selten, ein Buchtipp, welches es öfters mal für Lau gibt. Dieser hier ist ein Beispiel 😉

Wenn du aber eine oder andere Frage hast, werde ich sie dir beantworten.
 
Wäre laut Vereinbarung eine Straftat. Nichts für ungut, aber die besagten Bücher habe ich größtenteils erworben und das Weitergeben ist laut AGBs untersagt und wird geahndet. Den Rest habe ich mir hier und da für Lau geladen und hier ist der heiße Tipp: komm öfter mal vorbei, ab und an postet mal der oder die andere, aber eher selten, ein Buchtipp, welches es öfters mal für Lau gibt.

Wenn du aber eine oder andere Frage hast, werde ich sie dir beantworten.
Ok ach kein Ding 🙂 Wenn ich Fragen habe werde ich mich melden 🙂
 
Tipp: Wenn man den Scanner verwenden möchte so sollte man sich auf eine Methode zum Beispiel nextLine() festlegen. Das erspart unerwünschte Fehlerfälle und darüber hinaus zusatz Programmlogik.

@Javinner Du kannst mir nicht einen Teil Deiner Bücher schicken - oder? 😀
 
Nur ganz am Rande: Gerade Englische Fachbücher sollen Gerüchten zufolge von irgendwelchen Leuten - vor allem in Russland und China - einfach so als PDF ins Netz gestellt werden und sollen sogar per Google oft problemlos auffindbar. Aber das ist natürlich nur ein Gerücht, das ich mal gehört habe ...

Wenn man aber wirklich viel Fachbücher lesen möchte, dann ist aus meiner Sicht eine Subscription top. Ich nutze eine Subscription vom packt Verlag für 9,99 US $ / Monat (99$ / Jahr) und bin damit sehr zufrieden. (Gibt dann auch jeden Monat ein Token, mit dem man ein Buch DRM Frei herunter laden kann!)

Das kommt nicht an das Angebot von O'Reilly heran, aber das kostet auch 43€/Monat bzw. 436€/Jahr, was mir zuviel erscheint. die 1-2 Bücher pro Monat kann man sich da dann auch direkt kaufen.... Es ist gut, wenn man in ein Buch hinein schnuppern will oder so, aber ansonsten lohnt sich der Betrag aus meiner Sicht nicht. Aber das Angebot ist berauschend - enthält eigentlich alles, was man sich so wünscht.

Diese Subscriptions haben vor allem Bücher auf Englisch. Das sollte einem natürlich bewusst sein.
 
Nur ganz am Rande: Gerade Englische Fachbücher sollen Gerüchten zufolge von irgendwelchen Leuten - vor allem in Russland und China - einfach so als PDF ins Netz gestellt werden und sollen sogar per Google oft problemlos auffindbar. Aber das ist natürlich nur ein Gerücht, das ich mal gehört habe ...

Wenn man aber wirklich viel Fachbücher lesen möchte, dann ist aus meiner Sicht eine Subscription top. Ich nutze eine Subscription vom packt Verlag für 9,99 US $ / Monat (99$ / Jahr) und bin damit sehr zufrieden. (Gibt dann auch jeden Monat ein Token, mit dem man ein Buch DRM Frei herunter laden kann!)

Das kommt nicht an das Angebot von O'Reilly heran, aber das kostet auch 43€/Monat bzw. 436€/Jahr, was mir zuviel erscheint. die 1-2 Bücher pro Monat kann man sich da dann auch direkt kaufen.... Es ist gut, wenn man in ein Buch hinein schnuppern will oder so, aber ansonsten lohnt sich der Betrag aus meiner Sicht nicht. Aber das Angebot ist berauschend - enthält eigentlich alles, was man sich so wünscht.

Diese Subscriptions haben vor allem Bücher auf Englisch. Das sollte einem natürlich bewusst sein.

Oder man zahlt die jährlichen Gebühren (~20€) und geht zur nächstgelegenen Uni. Man muss zwar ans verlängern denken aber dafür hat man ne viel größere Auswahl an Büchern.
 
Oder man zahlt die jährlichen Gebühren (~20€) und geht zur nächstgelegenen Uni. Man muss zwar ans verlängern denken aber dafür hat man ne viel größere Auswahl an Büchern.
Also größere Auswahl als bei O'Reilly Learning glaube ich kaum. Die sind was Fachbücher angeht sehr gut aufgestellt.

Für einen Studenten, der eh an der Hochschule ist, ist das kein Thema, aber ansonsten sind da auch Fahrzeiten einzurechnen - und dann kommt es mit dem Abo oder dem Bücher kaufen schon fast günstiger. Es sei denn, man versucht über Fernleihe das über eine lokale Bücherei zu machen, aber da kann man wohl nicht verlängern ...

Also auf jeden Fall ein guter Hinweis nur eben für mich nicht tauglich 🙂
 
Sorry, das mit den Büchern senden/schicken war nicht so gemeint - und ich weiß, dass das mitunter eine strafbare Handlung ist. 🙁
 

Zurück
Oben