Methoden Bitte Helft mir meinen Fehler zu finden. Möchte in diesem Bankenprogramm durch die Konsoleneingabe auswählen welches Konto reduziert und welches erhö

flocke77

Mitglied
Das ist die Elternklasse


Java:
import java.util.Scanner;
public class konto {
public String name;
private int kontoNr;
private double kontoStand;

public konto(String name, int kontoNr, double kontoStand) {
this.name = name;
this.kontoNr = 0;
this.kontoStand = 0;
}

void ueberWeisen(konto zielKonto, double betrag) {
kontoStand -= betrag;
zielKonto.kontoStand += betrag;
System.out.println("Neuer Kontostand reduziertes Konto: "+ kontoStand);
System.out.println("Neuer Kontostand erhöhtes Konto: "+ zielKonto.kontoStand);
}

void dataRead() {
Scanner readKonto = new Scanner(System.in);
System.out.println("Geben sie den Namen des Kontoinhabers ein: ");
String readName = readKonto.next(name);
name = readName;
System.out.println("Geben sie die Kontonummer ein: ");
int readKontoNr = readKonto.nextInt();
kontoNr = readKontoNr;
System.out.println("Geben sie den Kontostand ein: ");
int readKontoStand = readKonto.nextInt();
kontoStand = readKontoStand;
System.out.println("Name des Kontoinhabers: "+ readName + "\n" + "Kontonummer: " + readKontoNr + "\n" + "Kontostand: " + readKontoStand);
}

public konto() {

}
}

Die erste Kindklasse

Java:
public class Girokonto extends konto{
Girokonto(String name, int kontoNr, double kontoStand){
  super(name, kontoNr, kontoStand);
}

Girokonto() {
  
}
}


Die zweite Kindklasse

Java:
public class Sparbuch extends konto{
Sparbuch(String name, int kontoNr, double kontoStand){
  super(name, kontoNr, kontoStand);
}

Sparbuch() {
  
}
}




Und das Hauptprogramm:


Java:
import java.util.Scanner;
public class Bankleitsystem {
public static void main (String[] args) {
konto konto1 = new konto();
Girokonto gKonto = new Girokonto();
Sparbuch sKonto = new Sparbuch();

konto1.dataRead();
gKonto.dataRead();
sKonto.dataRead();

Scanner waehleKonto = new Scanner(System.in);
System.out.println("Wählen sie das Konto aus das sie reduzieren möchten."+"\n"+"Für das konto wählen sie die 1, für das Girokonto die 2 und für das Sparbuch die 3: ");
int kWahl1 = waehleKonto.nextInt();
System.out.println("Wählen sie das Konto aus das sie erhöhen möchten."+"\n"+"Für das konto wählen sie die 1, für das Girokonto die 2 und für das Sparbuch die 3: ");
int kWahl2 = waehleKonto.nextInt();
System.out.println("Wählen sie den gewünschten überweisungsbetrag: ");
double ueberWahl = waehleKonto.nextInt();

switch(kWahl1) {
case 1:
switch(kWahl2) {
case 2: konto1.ueberWeisen(gKonto, ueberWahl);
break;
case 3: konto1.ueberWeisen(sKonto, ueberWahl);
break;
default: System.out.println("Falsche Eingabe! Bitte 1, 2 oder 3 wählen.");
break;
}
break;
case 2:
switch(kWahl2) {
case 1: gKonto.ueberWeisen(konto1, ueberWahl);
break;
case 3: gKonto.ueberWeisen(sKonto, ueberWahl);
break;
default: System.out.println("Falsche Eingabe! Bitte 1, 2 oder 3 wählen.");
break;
}
case 3:
switch(kWahl2) {
case 1: sKonto.ueberWeisen(konto1, ueberWahl);
break;
case 2: sKonto.ueberWeisen(gKonto, ueberWahl);
default: System.out.println("Falsche Eingabe! Bitte 1, 2 oder 3 wählen.");
break;
}
}
}
}
 
Zuletzt bearbeitet von einem Moderator:
Code:
import java.util.Scanner;

public class konto {
    public String name;
    private int kontoNr;
    private double kontoStand;
    
    public konto(String name, int kontoNr, double kontoStand) {
        this.name = name;
        this.kontoNr = 0;
        this.kontoStand = 0;
    }
    
    void ueberWeisen(konto zielKonto, double betrag) {
        kontoStand -= betrag;
        zielKonto.kontoStand += betrag;
        System.out.println("Neuer Kontostand reduziertes Konto: "+ kontoStand);
        System.out.println("Neuer Kontostand erhöhtes Konto: "+ zielKonto.kontoStand);
    }
    
    void dataRead() {
        Scanner readKonto = new Scanner(System.in);
        System.out.println("Geben sie den Namen des Kontoinhabers ein: ");
        String readName = readKonto.next(name);
        name = readName;
        System.out.println("Geben sie die Kontonummer ein: ");
        int readKontoNr = readKonto.nextInt();
        kontoNr = readKontoNr;
        System.out.println("Geben sie den Kontostand ein: ");
        int readKontoStand = readKonto.nextInt();
        kontoStand = readKontoStand;
        System.out.println("Name des Kontoinhabers: "+ readName + "\n" + "Kontonummer: " + readKontoNr + "\n" + "Kontostand: " + readKontoStand);
        }
    
    public konto() {
        
    }
}
 
Code:
public class Girokonto extends konto{
    Girokonto(String name, int kontoNr, double kontoStand){
        super(name, kontoNr, kontoStand);
    }
    
    Girokonto() {
        
    }
}
 
Code:
public class Sparbuch extends konto{
    Sparbuch(String name, int kontoNr, double kontoStand){
        super(name, kontoNr, kontoStand);
    }
    
    Sparbuch() {
        
    }
}
 
Code:
import java.util.Scanner;

public class Bankleitsystem {
    public static void main (String[] args) {
        konto konto1 = new konto();
        Girokonto gKonto = new Girokonto();
        Sparbuch sKonto = new Sparbuch();
        
        konto1.dataRead();
        gKonto.dataRead();
        sKonto.dataRead();
        
        Scanner waehleKonto = new Scanner(System.in);
        System.out.println("Wählen sie das Konto aus das sie reduzieren möchten."+"\n"+"Für das konto wählen sie die 1, für das Girokonto die 2 und für das Sparbuch die 3: ");
        int kWahl1 = waehleKonto.nextInt();
        System.out.println("Wählen sie das Konto aus das sie erhöhen möchten."+"\n"+"Für das konto wählen sie die 1, für das Girokonto die 2 und für das Sparbuch die 3: ");
        int kWahl2 = waehleKonto.nextInt();
        System.out.println("Wählen sie den gewünschten überweisungsbetrag: ");
        double ueberWahl = waehleKonto.nextInt();
        
        switch(kWahl1) {
        case 1:
            switch(kWahl2) {
            case 2: konto1.ueberWeisen(gKonto, ueberWahl);
            break;
            case 3: konto1.ueberWeisen(sKonto, ueberWahl);
            break;
            default: System.out.println("Falsche Eingabe! Bitte 1, 2 oder 3 wählen.");
            break;
            }
            break;
        case 2:
            switch(kWahl2) {
            case 1: gKonto.ueberWeisen(konto1, ueberWahl);
            break;
            case 3: gKonto.ueberWeisen(sKonto, ueberWahl);
            break;
            default: System.out.println("Falsche Eingabe! Bitte 1, 2 oder 3 wählen.");
            break;
            }
        case 3:
            switch(kWahl2) {
            case 1: sKonto.ueberWeisen(konto1, ueberWahl);
            break;
            case 2: sKonto.ueberWeisen(gKonto, ueberWahl);
            default: System.out.println("Falsche Eingabe! Bitte 1, 2 oder 3 wählen.");
            break;
            }
        }
    }
}
 
Java:
    public konto(String name, int kontoNr, double kontoStand) {
        this.name = name;
        this.kontoNr = 0;
        this.kontoStand = 0;
    }
}
Was mir aber hier auffällt ist, dass du Werte übergibst und sie nicht zuweist 😉

Es sollte eher so aussehen:
Java:
public konto(String name, int kontoNr, double kontoStand) {
    this.name = name;
    this.kontoNr = kontoNr;
    this.kontoStand = kontoStand;
}
 
Vor allem...was genau ist dein Problem?
Ich würde sagen er hat viele Probleme (leider). Mal eine winzige Auswahl:
- 2x nextInt() hintereinander
Java:
int kWahl1 = waehleKonto.nextInt();
int kWahl2 = waehleKonto.nextInt();
- Der Parameter name in next macht keinen Sinn https://docs.oracle.com/en/java/jav...java/util/Scanner.html#next(java.lang.String) vs https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Scanner.html#next()
Java:
String readName = readKonto.next(name);
- Einen double kann man nicht mit nextInt() einlesen
Java:
double ueberWahl = waehleKonto.nextInt();
-
Was mir aber hier auffällt ist, dass du Werte übergibst und sie nicht zuweist 😉
Den Konstruktor ruft er nicht mal auf
 
In Java werden per Konvention Klassennamen immer mit einem Großbuchstaben begonnen. Variablen- und Methodennamen immer mit einem Kleinbuchstaben (außer natürlich der Konstruktor). Das sollte man sich von Anfang an angewöhnen. Du hast das fast überall gemacht, bis auf die Klasse "konto".

Edit: Die Ausführungen von hier an führen evtl. zu weit für dich. Wenn du magst lies sie und setze sie auch um. Du kannst das aber auch erst Mal ignorieren, bis du etwas weiter bist.

Die parameterlosen Standardkonstruktoren solltest du in allen deinen Klassen entfernen. Generell sollte eine Instanz nach der Erstellung "benutzbar" sein, also alle wichtigen Zuständen (in den Instanzvariablen) sollten korrekt zugewiesen werden. Das wird i.d.R. über den Konstruktor realisiert. Deine verwendeten Konstruktoren sollten demnach alle Parameter haben. Sonst kannst du ja namenlose Konten erstellen und das ist nicht im Sinne des Erfinders.

Ich sehe auch warum du das gemacht hast. Du hast Ein- und Ausgaberoutinen in deinen Klassen. Das ist nicht so schön. Normalerweise wird die Ein- und Ausgabe von der Logik getrennt. Du solltest also neben deinen Kontoklassen noch Klassen für das Einlesen der Kontodaten und der Kontobewegungen haben und für die Ausgabe.
 
Zuletzt bearbeitet:
Das Programm lässt sich in dem gezeigten Zustand -mit einer kleinen Korrektur- unter Eclipse mit JDK 12 übrigens zum Laufen und Ausführen bringen. Und bei der Abfrage und der Kontrolle der möglichen Eingabewerte sollte man informative Hinweise und sinnvolle Grenzen setzen (und diese intern kontrollieren). Wobei an dem Programm noch mehr zu reparieren ist, siehe vorige Kommentare.
Die kleine Korrektur bezieht sich auf das bereits genannte "String readName = readKonto.next(name); " und sollte besser durch
Code:
 String readName = readKonto.nextLine();
ersetzt werden (Stichwort ansonsten: NPE)
 
Genereller Tipp:
Ich bin persönlich kein Fan von switch-case. Fast alle Usecases lassen sich ohne diesen realisieren. In deinem speziellen Fall hast du n Konten, hier mit n = 3. Stell dir vor dein Prof verlangt nun dein Code soll 4 Konten haben, was machst du dann? Willlst du echt alle switch-case vergrößern? Der Aufwand steigt quadratisch! Statt dem Switch-Case legst du die eine Menge von Konten an, z.B. ein Array. Dann suchst du dir das entsprechende Konto mit dem Index. Das sieht dann etwa so aus:

Java:
Konto[] konten = { konto, girokonto, sparbuch };
Konto konto1 = konten[kWahl1 - 1];
Konto konto2 = konten[kWahl2 - 1];
konto1.ueberweise(konto2, betrag);
 
Es hat funktioniert! Habe die leeren Konstruktoren entfernt, nextint durch nextdouble ersetzt, readKonto.next(Name) durch readKonto.nextLine ersetzt und zu guter Letzt die switch cases durch ein Array.
War echt super hilfreich und ich bin froh das es läuft.
Das ich die Ein- und Ausgabe in extra Klassen anlege und das Programm nochmal umstrukturiere damit beschäftige ich mich die Tage nochmal.
 
Code:
import java.util.Scanner;

public class Bankleitsystem {
    public static void main (String[] args) {
        Konto konto1 = new Konto(null, 0, 0);
        Girokonto gKonto = new Girokonto(null, 0, 0);
        Sparbuch sKonto = new Sparbuch(null, 0, 0);
        
        konto1.dataRead();
        gKonto.dataRead();
        sKonto.dataRead();
        
        Scanner waehleKonto = new Scanner(System.in);
        System.out.println("Wählen sie das Konto aus das sie reduzieren möchten."+"\n"+"Für das konto wählen sie die 1, für das Girokonto die 2 und für das Sparbuch die 3: ");
        int kWahl1 = waehleKonto.nextInt();
        System.out.println("Wählen sie das Konto aus das sie erhöhen möchten."+"\n"+"Für das konto wählen sie die 1, für das Girokonto die 2 und für das Sparbuch die 3: ");
        int kWahl2 = waehleKonto.nextInt();
        System.out.println("Wählen sie den gewünschten überweisungsbetrag: ");
        double ueberWahl = waehleKonto.nextDouble();
        
        Konto[] konten = { konto1, gKonto, sKonto};
        Konto reduzierungsKonto = konten[kWahl1 - 1];
        Konto erhoehungsKonto = konten[kWahl2 - 1];
        reduzierungsKonto.ueberWeisen(erhoehungsKonto, ueberWahl);
        
    }
}
 

Zurück
Oben