Kann man den Code vereinfachen?

N

Nutzer321

Mitglied
Hallo zusammen,

ich sitze derzeitig an einem Programm, bei der die Summenformel berechnet werden soll. Allerdings liegt das Augenmerk auf das abfangen von Fehlern bei der Benutzereingabe.

Konkret läuft das Programm so ab, dass der Benutzer
- begrüßt wird
- eine ganzzahlige Zahl eingegeben werden soll
- Ist die Zahl ganzzahlig und zwischen 1 und 100 wird sie an die Fachklasse geschickt, mit der Summenformel berechnet, zurückgeschickt und anschließend auf der Konsole wieder ausgegeben.

- Ist die Zahl nicht ganzzahlig oder nicht im Intervall [1;100] kommt eine Meldung, die den Benutzer auffordert entweder a oder n einzugeben.
- mit a wird das Programm abgebrochen
- mit n startet das Programm wieder von Vorne.
- gibt der Benutzer etwas anderes ein, kann er/sie wieder zwischen a oder n entscheiden.

Bisher habe ich den folgenden Code.

Die Frage ist eigentlich nur ob ich den Code in der Starter klasse vereinfachen kann, z.B. im Catch auch abfangen, falls die Zahl nicht im Intervall [1;100] ist.

Starter:
package summe;

import java.util.*;

public class Starter {

    public static void main(String[] args) {
        
        Scanner tastatur; //Scanner deklarieren
        tastatur=new Scanner(System.in);

        int schalter=0, b; //Scahlter auf 0 setzen
        String nochmal;

        Kunde meinKunde;
        meinKunde=new Kunde(); //Fachklasse dekalrieren
        
        while (schalter==0) {  //Die Folgende Schleife wird solange ausgeführt, wie Scahlter den Wert 0 hat
        System.out.println("Bitte geben sie ihren gewünschten Zielwert ein: "); //Ausageb Zielwert eingeben
        
        //Lässt den Benutzer eine Zeichenkette eingeben;
        
        try {
            String a = tastatur.nextLine();
            b = Integer.parseInt(a);//Lässt den Benutzer eine Zeichenkette eingeben und probiert die Zeichenkette in ein Int umzuwandeln
            
                
            
            if (b>=100||b<=1) {
               //schalter=0;
               System.out.println("Es wurde keine ganze Zahl eingegeben oder sie ist nicht zwischen 1 und 100."); //User informieren dass kein Int eingeben wurde und ihn mit a oder n fortfahren lassen
               System.out.println("Wollen sie (a)bbrechen oder es (n)ocheinmal versuchen");
               nochmal=tastatur.next(); //Lässt den Benutzer einen String eingeben (a oder n eingeben) und in die Variable nochmal senden.
                
              
                while (!(nochmal=="a")||!(nochmal=="n")  ) //Solange die eingabe kein a oder n ist passiert folgendes
                    switch (nochmal) { //Mit Switch werden folgende Optionen für die Variable nochmal möglich
                
                    case "n": // Wenn n eingeben wurde,
                    
                        Starter.main(null);         //geht das Programm zur Main Methode (Z.8) über und startet von dort erneut
                    
                    
                    
                    case "a": //Wenn a eingeben wurde,
                        System.out.println("Abbruch"); //User informieren dass er abbricht
                        System.exit(0); //Programm beenden
                    
                    default: //Wenn etwas anderes eingegeben wird
                        System.out.println("Geben sie entweder a oder n ein");
                        nochmal=tastatur.next();
        
                    
                
                    }
                } else {
                    System.out.println("Eingegebene Zahl: " + b); //Gibt bei Erfolg die ganze Zahl aus
                    meinKunde.setZahl(b); //Sendet b in die Fachklasse
                    schalter++; //Addiert zum Scahlter 1 dazu, beendet die While Schleife
                    System.out.println("Die Summe ist " + meinKunde.calcZahl()); //DIe SUmme ausgeben
            }
        //Kann man ab hier vereinfachen?
            
                } catch (NumberFormatException e ) { //Ist der String alles andere als int passiert folgendes:
            
                    b=200;
            
                    System.out.println("Es wurde keine ganze Zahl eingegeben oder sie ist nicht zwischen 1 und 100."); //User informieren dass kein Int eingeben wurde und ihn mit a oder n fortfahren lassen
                    System.out.println("Wollen sie (a)bbrechen oder es (n)ocheinmal versuchen");
                    nochmal=tastatur.next(); //Lässt den Benutzer einen String eingeben (a oder n eingeben) und in die Variable nochmal senden.
            
            while (!(nochmal=="a")||!(nochmal=="n")  ) //Solange die eingabe kein a oder n ist passiert folgendes
                switch (nochmal) { //Mit Switch werden folgende Optionen für die Variable nochmal möglich
            
                    case "n": // Wenn n eingeben wurde,
                
                        Starter.main(null);         //geht das Programm zur Main Methode (Z.8) über und startet von dort erneut
                
                
                
                    case "a": //Wenn a eingeben wurde,
                        System.out.println("Abbruch"); //User informieren dass er abbricht
                        System.exit(0); //Programm beenden
                
                    default: //Wenn etwas anderes eingegeben wird
                        System.out.println("Wie inkompetent sind sie eigentlich, geben sie entweder a oder n ein");
                        nochmal=tastatur.next();
                        }
          
                    }
        
            
      
            }
    
        }
}

Kunde:
package summe;


public class Kunde {

    private int zahl;




    public int getZahl() {
        return zahl;
    }


    public void setZahl(int zahl) {
        this.zahl = zahl;
    }
    
    public int calcZahl(){
            int a, b, c; //a=Nr. des Durchlaufs; b=Wert der Dazuaddiert wird c=b-a (Da im 2. Durchlauf n-1 addiert wird;
            
            a=0;
            b=0;
            c=this.zahl;
            
            while (a<this.zahl) { //Solange a kleiner gleich das Zielegebnis ist wird die Schleife ausgeführt:
                a++;
                b=b+a;  //Der Wert der dazuaddiert wird (n, n-1...) von n abgezogen
                                //Der Überwachungsfaktor a um eins addiert (Dass er rechtzeitig die Schleife beendet
                c=c+b;                //Zu c (Der Summe) b addiertt wird.
                
            }                        //Schleife wird beendet
            return b;                //Am Ende muss nochmal der Anfangswert abgezogen werden
        }


    //Das hier ist nur zum Überprüfen, gehört nicht zur Aufgabe.
            
        public int summeZahl(){
                int ergebnis;
                ergebnis=(this.zahl*(this.zahl+1))/2;
                return ergebnis;
            }

        //Für Fakultäten
        public int multiZahl(){
            int a, b, c; //a=Nr. des Durchlaufs; b=Wert der Dazuaddiert wird c=b-a (Da im 2. Durchlauf n-1 addiert wird;
            
            a=0;
            b=0;
            c=this.zahl;
            
            while (a<this.zahl) { //Solange a kleiner gleich das Zielegebnis ist wird die Schleife ausgeführt:
                b=(this.zahl-a);  //Der Wert der dazuaddiert wird (n, n-1...) von n abgezogen
                a++;                //Der Überwachungsfaktor a um eins addiert (Dass er rechtzeitig die Schleife beendet
                c=c*b;                //Zu c (Der Summe) b addiertt wird.
            
            }                        //Schleife wird beendet
            return c/this.zahl;                //Am Ende muss nochmal der Anfangswert abgezogen werden
        }


            public int summe(){
                
                return this.zahl/2;
            }
            
        
            


}

Für eure Hilfe bin ich im Voraus dankbar.
 
H

httpdigest

Top Contributor
Zuerst einmal solltest du den Code so schreiben, dass er auch korrekt funktioniert. Danach kannst du optimieren.
Folgende Dinge sind noch fehlerhaft:
- Du vergleichst auf Strings, die der User eingibt, per ==. Strings vergleicht man mit .equals()
- deine switch-cases für Abbrechen bzw. Nochmal sind fall-through (der obere Fall fällt in den unteren hinein)
- die Bedingung b>=100 || b<=1 ist falsch
(- die Fehlermeldungen für die inkorrekten Eingaben sind unpräzise, bzw. spiegeln nicht den eigentlich in diesem Fall aufgetretenen Fehler korrekt wider. Die kann man noch präziser/konkreter formulieren)

Ich empfehle dir, dein Programm erstmal wirklich durch Ausführen zu testen.
 
mihe7

mihe7

Top Contributor
Auch die Bedingung !(nochmal=="a")||!(nochmal=="n") solltest Du nochmal überdenken (unabhängig davon, dass man Strings mit equals vergleicht).
 
N

Nutzer321

Mitglied
Danke für eure Antworten.
Der Code funktioniert soweit, das habe ich schon getestet.
- Du vergleichst auf Strings, die der User eingibt, per ==. Strings vergleicht man mit .equals()
Auch die Bedingung !(nochmal=="a")||!(nochmal=="n") solltest Du nochmal überdenken (unabhängig davon, dass man Strings mit equals vergleicht).
Ich habe die Zeilen mit dem Befehl nochmal überarbeitet. Stimmt das so?
while (!(nochmal.equals("a"))||!(nochmal.equals("n"))) {

die Bedingung b>=100 || b<=1 ist falsch
Und was wäre richtig:)? Ich sage ja wenn das richtig ist, dass eine "Fehlermeldung" ausgegeben werden soll.
(- die Fehlermeldungen für die inkorrekten Eingaben sind unpräzise, bzw. spiegeln nicht den eigentlich in diesem Fall aufgetretenen Fehler korrekt wieder. Die kann man noch präziser/konkreter formulieren)
Und wie kann ich das noch präzisieren? :)
 
H

httpdigest

Top Contributor
Der Code funktioniert soweit, das habe ich schon getestet.
Dann hast du aber sehr schlecht getestet.
1. Starte das Programm und gebe die Zahl "1" oder "100" ein. -> Fehler, obwohl im erlaubten Intervall [1, 100]
2. Starte das Programm und gib "a" (als falsche Zahl) ein. Daraufhin gebe "n" (für nochmal) ein und dann gebe "2" als erglaubte Zahl ein. -> Es wird "Abbruch" ausgegeben (aufgrund des fall-throughs des oberen rekursiven Aufrufes)

Naja, und der rekursive Aufruf der main-Methode, nur um ein erneutes Ausführen anzustossen, ist... naja... nicht so doll, weil die rekursiven Aufrufe ja auch wieder abgewickelt werden, wenn die Methode zurückkehrt, was du aber durch ein System.exit() im fall-through case explizit abbrichst (auch nicht gut).
 
N

Nutzer321

Mitglied
Vielen Dank für die Hinweise.
1. Starte das Programm und gebe die Zahl "1" oder "100" ein. -> Fehler, obwohl im erlaubten Intervall [1, 100]
Hab ich übersehen und abgeändert in if (b>100||b<1) {
2. Starte das Programm und gib "a" (als falsche Zahl) ein. Daraufhin gebe "n" (für nochmal) ein und dann gebe "2" als erglaubte Zahl ein. -> Es wird "Abbruch" ausgegeben (aufgrund des fall-throughs des oberen rekursiven Aufrufes)
Ist mir erst jetzt aufgefallen.
@httpdigest Das mit dem Falltrough habe ich registriert, weiß aber nicht wie ich das ändern kann.
Könnt ihr mir eine Hilfestellung geben, wie ich das am besten ändere?
 
H

httpdigest

Top Contributor
Ich habe deine Starter Klasse mal selber refactored, und gebe dir zumindest mal die main() Methode, wie diese meiner Meinung nach aussehen könnte:
Java:
public static void main(String[] args) {
  Scanner tastatur = new Scanner(System.in);
  boolean nochmal;
  do {
    try {
      int zahl = leseGueltigeZahlVomBenutzerEin(tastatur);
      gebeZeileAus("Eingegebene Zahl: " + zahl);
      int ergebnis = berechneErgebnis(zahl);
      gebeZeileAus("Die Summe ist " + ergebnis);
      nochmal = false;
    } catch (NumberFormatException e) {
      gebeZeileAus("Es wurde keine ganze Zahl eingegeben.");
      nochmal = frageNutzerObNochmal(tastatur);
    } catch (ZahlNichtImErlaubtenIntervallException e) {
      gebeZeileAus("Die eingegebene Zahl liegt nicht zwischen 1 und 100.");
      nochmal = frageNutzerObNochmal(tastatur);
    }
  } while (nochmal);
}
Jetzt kannst du die aufgerufenen aber fehlenden Methoden noch implementieren, gemäss dem, was sie sagen, was sie tun.
Versuche generell, einzelne funktionale "Aspekte" deines Codes zu erkennen und diese als eigene Methoden mit sprechenden Namen zu isolieren.
 
mihe7

mihe7

Top Contributor
Java:
public class ZahlNichtImErlaubtenIntervallException extends Exeption {
}

Java:
throw new ZahlNichtImErlaubtenIntervallException();
 
N

Nutzer321

Mitglied
ZahlNichtImErlaubtenIntervallException:
package summe;



public class ZahlNichtImErlaubtenIntervallException  extends Exception{

    public int ZahlNichtImErlaubtenIntervallException(){
        int zahl=;
        if (zahl<1||zahl>100) {
            throw new ZahlNichtImErlaubtenIntervallException();
        } else {
            return zahl;
        }
  }
 }

Ich hab jetzt das geschrieben. Wie bekomme ich den Wert der in der Starterklasse eingegeben wird in die ZahlNichtImErlaubtenIntervallException Klasse gesendet? Muss ich dafür eine get/set Methode schreiben oder geht das auch einfacher?
 
kneitzel

kneitzel

Top Contributor
In der Exception brauchst Du den Code doch gar nicht. Die Exception dient doch nur dem Abbruch des normalen Ablaufs um dann ggf. in einem try / catch behandelt zu werden.

Du musst also die Methode leseGueltigeZahlVomBenutzerEin schreiben. In dieser Methode fragst Du also nach der Zahl und da kommt dann dein Code hin von wegen:
Java:
        if (zahl<1||zahl>100) {
            throw new ZahlNichtImErlaubtenIntervallException();
        } else {
            return zahl;
        }
 
N

Nutzer321

Mitglied
Hallo nocheinmal,
erstmal danke für die Hilfe(n), ich komme meinem Ziel immer näher.

Mittlerweile habe ich eine 3. Klasse erstellt in der die Exception bestimmt wird.
DIe Behandlungsmethode habe ich auch in eine andere Methode ausgelagert.

Das Problem mit dem Abbruch erscheint jetzt nicht mehr, allerdings wird der Default-Wert, wenn die erste Eingabe falsch ist nicht verarbeitet und stattdessen der nochmal fall angenommen.

Anbei der Code, ich hoffe ir könnt mir noch ein letztes mal helfen😀.

Starter:
package summe;

import java.util.*;

public class Starter {

    static boolean end;

    public static void main(String[] args) {
        
        Scanner tastatur = new Scanner(System.in);
        
        Rechner meinRechner = new Rechner();
        
        boolean end = false;
        
        do {
            try {
                System.out.print("Gib eine ganze Zahl im Bereich [1-100] ein: ");
                String a = tastatur.nextLine();
                int value = Integer.parseInt(a);
                meinRechner.setZahl(value);
                meinRechner.summeZahl();
                
                System.out.println("Eingegebne Zahl: " + value);
                System.out.println(meinRechner.summeZahl());
                end = true;
          
            } catch (NumberFormatException e) {
                handleException();
          
            } catch (EigeneException e) {
                handleException();
    }
}  while (!end);
    
}

    private static void handleException() {
        
        Scanner tastatur = new Scanner(System.in);
        
        System.out.println("Die Eingabe ist keine ganze Zahl");
        System.out.println("(n)ochmal oder (a)bbrechen");

        int schalter2=0;
        String nochmal=tastatur.next();
        while (schalter2<0) {
        
        switch (nochmal) {
        
        case "n": // Wenn n eingeben wurde,
            schalter2=1;
            Starter.main(null);         //geht das Programm zur Main Methode (Z.8) über und startet von dort erneut
            end = true;
    
    
    
        case "a": //Wenn a eingeben wurde,
            schalter2=1;
            System.out.println("Abbruch"); //User informieren dass er abbricht
            System.exit(0); //Programm beenden
            
        default: //Wenn etwas anderes eingegeben wird
            System.out.println("Wie inkompetent sind sie eigentlich, geben sie entweder a oder n ein");
            nochmal=tastatur.next();
            schalter2=schalter2-1;
        }
      }
    }
}

Rechner:
package summe;

public class Rechner {
    
    public int summeZahl() throws EigeneException{
        int ergebnis;
        if (this.zahl>100||this.zahl<1) {
             throw new EigeneException("Keine Ganzzahl");
        }
        ergebnis=(this.zahl*(this.zahl+1))/2;
        return ergebnis;
      
    }


    private int zahl;


    public int getZahl() {
        return zahl;
    }


    public void setZahl(int zahl) {
        this.zahl = zahl;
    }
}

Eigene Exception:
package summe;

public class EigeneException extends Exception {

    public EigeneException() {
        super("Ich bin Ex");
        
    }
    public EigeneException(String fehlermeldung) {
        super(fehlermeldung);
    }
}
 
mihe7

mihe7

Top Contributor
Kannst Du uns mal verraten, was dieser komische schalter2 mit den ganzen Berechnungen soll? Außerdem sollst Du main nicht neu aufrufen. Für eine wiederholte Ausführung hast Du ja in main eine Schleife.

Auch das System.exit() brauchst Du nicht, wenn Du Dich an den Vorschlag von @httpdigest hältst. Dort liefert frageBenutzerObNochmal() einen booleschen Wert, über den bestimmt wird, ob die Schleife in main ein weiteres mal ausgeführt werden soll oder nicht. Falls nicht, beendet sich das Programm automatisch.
 
N

Nutzer321

Mitglied
Kannst Du uns mal verraten, was dieser komische schalter2 mit den ganzen Berechnungen soll
Ich probiere verzweifelt das Programm ab einem gewissem Punkt neu zu starten. Konkret dass wenn der Benutzer etwas anderes außer a oder n eingibt nochmal gefragt wird und dann nochmal die Chance hat a oder n einzugeben.
Außerdem sollst Du main nicht neu aufrufen. Für eine wiederholte Ausführung hast Du ja in main eine Schleife.
Und wie starte ich diese am besten? Auch über den boolschen Wert?
Auch das System.exit() brauchst Du nicht, wenn Du Dich an den Vorschlag von @httpdigest hältst. Dort liefert frageBenutzerObNochmal() einen booleschen Wert, über den bestimmt wird, ob die Schleife in main ein weiteres mal ausgeführt werden soll oder nicht. Falls nicht, beendet sich das Programm automatisch.
Ich probiere es mal einzubauen.
 
mihe7

mihe7

Top Contributor
Und wie starte ich diese am besten? Auch über den boolschen Wert?
Die Schleife ist in main doch "gestartet". Du hast eine Schleife in main mit einer Abbruchbedingung (end). Innerhalb dieser Schleife rufst Du eine Methode auf (z. B. handleException). Wenn die Methode zurückkehrt und die Abbruchbedingung nicht erfüllt ist, dann wird der Schleifenrumpf ein weiteres mal ausgeführt.
 
N

Nutzer321

Mitglied
Danke nochmal für die Hilfe. Ich habe nocheinmal von Vorne angefangen und das Programm läuft jetzt mit den Tipps von @httpdigest.
Das einzigste Problem ist, dass in der Methode frageNutzerObNochmal der Fall n (nocheinmal) dazu führt, dass folgender Block erscheint.
Bitte geben sie ihre Zahl ein
200
Die eingegebene Zahl liegt nicht zwischen 1 und 100.
(a)bbrechen oder (n)ochmal
n
Bitte geben sie ihre Zahl ein
Es wurde keine ganze Zahl eingegeben.
(a)bbrechen oder (n)ochmal


Weiß einer was ich falsch habe/was ich sonst in den return eintragen soll?

frageNutzerObNochmal:
private static boolean frageNutzerObNochmal(Scanner tastatur, boolean end) {
        System.out.println("(a)bbrechen oder (n)ochmal");
        String nochmal=tastatur.next();
        switch (nochmal) {
        case "n":
            end = true;
            return end;
            
        case "a":
            System.out.println("Abbruch");
            return false;
        default:
            frageNutzerObNochmal(tastatur, end);
        
        }
        return false;
    }

Um evtl den Kontext zu verstehen, habe ich nochmal die kompletten anderen Klassen beigefügt

Starter:
package summe;

import java.util.Scanner;


public class Starter {
    static Scanner tastatur=new Scanner(System.in);
    static Rechner meinRechner=new Rechner();
    
    public static void main(String[] args) throws ZahlNichtImErlaubtenIntervallException {
          Scanner tastatur = new Scanner(System.in);
          boolean end = false;
          do {
            try {
              int zahl = leseGueltigeZahlVomBenutzerEin(tastatur);
              meinRechner.setZahl(zahl);
              int ergebnis = meinRechner.summeZahl();
              System.out.println("Eingegebene Zahl: " + zahl);
              System.out.println("Die Summe ist " + ergebnis);
              end = false;
            } catch (NumberFormatException e) {
                System.out.println("Es wurde keine ganze Zahl eingegeben.");
              end = frageNutzerObNochmal(tastatur, end);
            } catch (ZahlNichtImErlaubtenIntervallException e) {
                System.out.println("Die eingegebene Zahl liegt nicht zwischen 1 und 100.");
              end = frageNutzerObNochmal(tastatur, end);
            }
          } while (end);
        }
    
    private static boolean frageNutzerObNochmal(Scanner tastatur, boolean end) {
        System.out.println("(a)bbrechen oder (n)ochmal");
        String nochmal=tastatur.next();
        switch (nochmal) {
        case "n":
            end = true;
            return end;
            
        case "a":
            System.out.println("Abbruch");
            return false;
        default:
            frageNutzerObNochmal(tastatur, end);
        
        }
        return false;
    }
    

    
    private static int leseGueltigeZahlVomBenutzerEin(Scanner tastatur) {
        System.out.println("Bitte geben sie ihre Zahl ein");
        String a;
        a=tastatur.nextLine();
        int b=Integer.parseInt(a);
        return b;
        
    }
    
}

Rechner:
package summe;

public class Rechner {
    
    public int summeZahl() throws ZahlNichtImErlaubtenIntervallException {
        int ergebnis;
        if (this.zahl>100||this.zahl<1) {
             throw new ZahlNichtImErlaubtenIntervallException("Keine Ganzzahl");
        }
        ergebnis=(this.zahl*(this.zahl+1))/2;
        return ergebnis;
      
    }


    private int zahl;


    public int getZahl() {
        return zahl;
    }


    public void setZahl(int zahl) {
        this.zahl = zahl;
    }
    
    public int calcZahl() {
        return (this.zahl*(this.zahl+1))/2;
    }

}

ZahlNichtImErlaubtenIntervallException:
package summe;

public class ZahlNichtImErlaubtenIntervallException extends Exception {
    public ZahlNichtImErlaubtenIntervallException() {
        super("Ich bin Ex");
        
    }
    public ZahlNichtImErlaubtenIntervallException(String fehlermeldung) {
        super(fehlermeldung);
    }

}

Hoffentlich könnt ihr mir nochmal helfen.
 
H

httpdigest

Top Contributor
frageNutzerObNochmal:
private static boolean frageNutzerObNochmal(Scanner tastatur, boolean end) {
    ...
    default:
        frageNutzerObNochmal(tastatur, end);
    }
    return false;
}
Das kann so doch auch nicht funktionieren. Wenn du schon unbedingt immer mit Rekursion arbeiten willst, dann darfst du den Rückgabewert des rekursiven Aufrufes nicht einfach wegschmeissen.
Beispiel: Gehe mal in den Fall, dass diese Methode aufgerufen wird, gib dann "t" (ungültige Eingabe) ein und dann gib mal "n" (für nochmal) ein und stelle fest, dass der oberste Aufruf dieser Methode false zurückliefert (und damit letztlich _nicht_ nochmal probiert wird), weil nicht das Ergebnis vom rekursiven Aufruf "hochgegeben" wird.
 
N

Nutzer321

Mitglied
Und wie liefere ich den Wert "hoch"?
Ich stehe grad wie der Ochs vorm Berg und verstehe nur Bahnhof😊
 
H

httpdigest

Top Contributor
Und wie liefere ich den Wert "hoch"?
Java:
private static boolean frageNutzerObNochmal(Scanner tastatur) {
  System.out.println("(a)bbrechen oder (n)ochmal");
  String nochmal=tastatur.next();
  switch (nochmal) {
  case "n":
      return true;
  case "a":
      System.out.println("Abbruch");
      return false;
  default:
      return frageNutzerObNochmal(tastatur);
  }
}
 
N

Nutzer321

Mitglied
Ausschnitt:
    private static boolean frageNutzerObNochmal(Scanner tastatur) {
        
        System.out.println("(a)bbrechen oder (n)ochmal");
        String nochmal=tastatur.next();
        
        switch (nochmal) {
        case "n":
            
            return true;
            
        case "a":
            System.out.println("Abbruch");
            return false;
        default:
            
            return frageNutzerObNochmal(tastatur);
        
        }
        
    }
Irgendwie bin ich zu blöd für java.
Ich habe es jetzt genauso wie du, allerdings kommt immer noch der Fehlermeldungsblock.
Falls es an der Rekursion liegt, wie würdest du es ohne Rekursion machen? ich mache die ja nicht mit Absicht sondern nur weil ich nicht weiß wie ich es anders machen soll.

Komplette Starter
Starter:
package summe;

import java.util.Scanner;


public class Starter {
    static Scanner tastatur=new Scanner(System.in);
    static Rechner meinRechner=new Rechner();
    
    public static void main(String[] args) throws ZahlNichtImErlaubtenIntervallException {
          Scanner tastatur = new Scanner(System.in);
          boolean end = false;
          do {
            try {
              int zahl = leseGueltigeZahlVomBenutzerEin(tastatur);
              meinRechner.setZahl(zahl);
              int ergebnis = meinRechner.summeZahl();
              System.out.println("Eingegebene Zahl: " + zahl);
              System.out.println("Die Summe ist " + ergebnis);
              end = false;
            } catch (NumberFormatException e) {
                System.out.println("Es wurde keine ganze Zahl eingegeben.");
              end = frageNutzerObNochmal(tastatur);
            } catch (ZahlNichtImErlaubtenIntervallException e) {
                System.out.println("Die eingegebene Zahl liegt nicht zwischen 1 und 100.");
              end = frageNutzerObNochmal(tastatur);
            }
          } while (end);
        }
    
    private static boolean frageNutzerObNochmal(Scanner tastatur) {
        
        System.out.println("(a)bbrechen oder (n)ochmal");
        String nochmal=tastatur.next();
        
        switch (nochmal) {
        case "n":
            
            return true;
            
        case "a":
            System.out.println("Abbruch");
            return false;
        default:
            
            return frageNutzerObNochmal(tastatur);
        
        }
        
    }
    

    
    private static int leseGueltigeZahlVomBenutzerEin(Scanner tastatur) {
        System.out.println("Bitte geben sie ihre Zahl ein");
        String a;
        a=tastatur.nextLine();
        int b=Integer.parseInt(a);
        return b;
        
    }
    
}
 
N

Nutzer321

Mitglied
Willst du mich von meinen Fehlern erlösen? Ich weiß noch nicht mal wo meine Fehler genau sind.

Hilft es evtl. wenn ich die frageNutzerObNochmal methode in 2 Methoden splitte?
Ausschntt:
private static boolean frageNutzerObNochmal(Scanner tastatur) {
        
        System.out.println("(a)bbrechen oder (n)ochmal");
        String nochmal=tastatur.next();
        return wiederholen(tastatur, false, nochmal);
    }
    
    private static boolean wiederholen(Scanner tastatur, boolean end, String nochmal) {
        
    
        switch (nochmal) {
        case "n":
            
            return true;
            
        case "a":
            System.out.println("Abbruch");
            return false;
        default:
            
            return frageNutzerObNochmal(tastatur);
        
        }
 
kneitzel

kneitzel

Top Contributor
Also bei der Ausgabe:

Die eingegebene Zahl liegt nicht zwischen 1 und 100.
(a)bbrechen oder (n)ochmal
n
Bitte geben sie ihre Zahl ein
Es wurde keine ganze Zahl eingegeben.
(a)bbrechen oder (n)ochmal

Was ist das Verhalten? Nach der Eingabe von n fragt er nach einer Zahl aber bricht sofort ab mit der Aussage, dass keine korrekte Zahl eingelesen wurde?

Hier ist das Verhalten von Scanner wichtig: Es wird nicht immer der ganze Buffer gelesen. Scanner ist Token-Basiert. Es wird dann immer nur das nächste Token gelesen. Daher kann es sein, dass da noch ein Zeilenumbruch vorhanden ist. Ich habe jetzt dein Einlesen einer Zahl nicht gefunden - aber evtl. ist das Problem, dass Du mit next nur den nächsten Token liest, der Zeilenumbruch ist noch vorhanden. Wenn die Zahl mit nextLine() gelesen werden sollte, dann kann dies der Zeilenumbruch von der n Eingabe sein.

Das kann man einfach nachstellen:

Java:
        Scanner scanner = new Scanner(System.in);
        String token = scanner.next();
        String line = scanner.nextLine();

Jetzt wird eine Eingabe gemacht, z.B.
n<Return>
Dann wird token zu n
und line zum leeren String.

Daher ist es fatal, wenn man tokenbasiert und zeilenbasiert den Scanner nutzen möchte. Entweder oder ... oder man "leert" bis zum Zeilenwechsel durch ein einfaches nextLine()
 
N

Nutzer321

Mitglied
In Zeile 34 von String nochmal=tastatur.next(); in String nochmal=tastatur.nextLine(); geändert und schon geht es😀. So versteckt können doch kleine Fehler sein.

Vielen Dank für die Hilfe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Code vereinfachen mit Schleife, aber wie genau? Java Basics - Anfänger-Themen 3
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
T Programmablaufsplaninterpretation in Code umformen Java Basics - Anfänger-Themen 1
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
M ISBN-Code Java Basics - Anfänger-Themen 26
B Zeitgleiches Arbeiten am Code mit mehreren Personen? Java Basics - Anfänger-Themen 7
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
marcooooo Code erklären Java Basics - Anfänger-Themen 28
marcooooo Code erklären Java Basics - Anfänger-Themen 4
S Advent of Code Day4 Java Basics - Anfänger-Themen 4
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
Gaudimagspam Caesars Code entziffern in Java Java Basics - Anfänger-Themen 8
Lukasbsc Wie kann ich meinen Code optimieren? Java Basics - Anfänger-Themen 4
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
T Main startet nicht bei vorgegebenen Code Java Basics - Anfänger-Themen 41
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
parrot Code entferneJedeZweiteZiffer Java Basics - Anfänger-Themen 6
G Code kürzen Java Basics - Anfänger-Themen 5
Bluedaishi Source Code Signieren Java Basics - Anfänger-Themen 22
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
L Best Practice Code refactern Java Basics - Anfänger-Themen 30
G code kürzen Java Basics - Anfänger-Themen 16
A Code umschreiben Java Basics - Anfänger-Themen 6
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
C Beispiel-Code mit Pair wird nicht compiliert. Java Basics - Anfänger-Themen 8
X Reverse algorithm engineering (Java code) Java Basics - Anfänger-Themen 6
T Bufferedwriter code Nullpointerexception Java Basics - Anfänger-Themen 4
V Switch Methode macht Code kaputt Java Basics - Anfänger-Themen 18
R Was muss ich an meinem Code ändern? Java Basics - Anfänger-Themen 2
S Bewertet meinen Code - Part 1 Java Basics - Anfänger-Themen 8
M Java Code Verständnis Java Basics - Anfänger-Themen 4
M Java Code Verständnis Java Basics - Anfänger-Themen 2
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Hierarchi im code darstellen Java Basics - Anfänger-Themen 11
S Struktogramm zu Code Java Basics - Anfänger-Themen 4
F Code kürzen Java Basics - Anfänger-Themen 9
J Fragen zum Code aus dem Buch "Schrödinger programmiert Java 2.te Ausgabe" Java Basics - Anfänger-Themen 6
S Hilfe bei meinem Code [Schleife]? Java Basics - Anfänger-Themen 5
S Brauche hilfe in Java [Fehler in mein Code]? Java Basics - Anfänger-Themen 2
J Array eintrag mit möglichst wenig code lösen Java Basics - Anfänger-Themen 16
N SelectionSort ; Code erläutern Java Basics - Anfänger-Themen 13
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
B Prüfen, ob Country Code in Europa ist? Java Basics - Anfänger-Themen 24
KopaCoda Getter mehrfach aufrufen -> ist das guter code? Java Basics - Anfänger-Themen 3
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21
O I/O Code Gerüst vorgegeben Java Basics - Anfänger-Themen 30
R Dieser Code sagt mir nichts... Java Basics - Anfänger-Themen 4
C Klassendiagramm aus Java-Code entwickeln Java Basics - Anfänger-Themen 3
A Eine Krone in der Textausgabe - Mein Code Java Basics - Anfänger-Themen 11
B HTML Code in XML speichern Java Basics - Anfänger-Themen 3
J Variablen Hilfe bei diesem Code Java Basics - Anfänger-Themen 6
H projekt 1 code schöner schreiben. Java Basics - Anfänger-Themen 25
R Code Verkürzen? Java Basics - Anfänger-Themen 19
B Interpreter-Fehler Code verstehen und Compilerfehler Java Basics - Anfänger-Themen 2
H Interface Hilfe mit Code Java Basics - Anfänger-Themen 4
C Verbesserungsvorschlag für effizienteren Code - (Project Euler10) Java Basics - Anfänger-Themen 26
D Erste Schritte Code verstehen - HashSet Java Basics - Anfänger-Themen 8
B HTML Code / Seite auslesen und JAVA Objekte erstellen Java Basics - Anfänger-Themen 12
C unverständlicher Code Attribute ohne Datentyp, wie geht das? Java Basics - Anfänger-Themen 8
H Code erläutern Java Basics - Anfänger-Themen 35
T Java Code erklären Java Basics - Anfänger-Themen 7
B Code Zeile unklar Java Basics - Anfänger-Themen 9
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
E ASCII-Code in Java ausgeben Java Basics - Anfänger-Themen 6
N Ich weiß nicht, wie ich meinen Code richtig designen soll und komme nicht weiter Java Basics - Anfänger-Themen 4
L Wie kann man fehlerfrei im Java Code auf die fxml Datei zugreifen? Java Basics - Anfänger-Themen 26
H Frage um den Code bildlich darzustellen Java Basics - Anfänger-Themen 2
U Methoden Code sinnvoll in Methoden einteilen Java Basics - Anfänger-Themen 2
R Problem mit Code Java Basics - Anfänger-Themen 3
D Erste Schritte Kontrolle Code Java Basics - Anfänger-Themen 17
D Text als Code in java-forum.com formatieren. Wie ? Java Basics - Anfänger-Themen 3
H 3 oder 4 Fehler im Code Java Basics - Anfänger-Themen 0
H 3 oder 4 Fehler im Code Java Basics - Anfänger-Themen 19
N Wie lerne ich neuen Code zu benutzen? Java Basics - Anfänger-Themen 6
S Unklarer Code (was passiert hier?) Java Basics - Anfänger-Themen 1
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
M Frage, wie dieser Code funktioniert, bzw. weshab er bei mir nicht funktioniert Java Basics - Anfänger-Themen 4
L Hilfe! Was macht dieser Code? Java Basics - Anfänger-Themen 1
WerIstDerBoogieman? Code review bzw. "Coaching" Java Basics - Anfänger-Themen 34
J Best Practice [Code Verbesserung] TXT einlesen und in Arrayliste speichern Java Basics - Anfänger-Themen 5
S Erste Schritte Was bedeutet dieser Code? Java Basics - Anfänger-Themen 2
D Erste Schritte Was bedeutet dieser Code? Java Basics - Anfänger-Themen 23
S Code richtig / besser machbar? (Nicht sicher, ob Code selbst falsch ist) Java Basics - Anfänger-Themen 4
G Zinsberechnung - Fehler im Code Java Basics - Anfänger-Themen 35
U Methoden Code Quality und Stil Java Basics - Anfänger-Themen 5
J Klammer im Code Java Basics - Anfänger-Themen 11
J Code Verständnis Java Basics - Anfänger-Themen 9
J Interface Fragen bezüglich "Sauberkeit" von Code Java Basics - Anfänger-Themen 5
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte von UML Diagramm zum Code Java Basics - Anfänger-Themen 29
N Problem bei meinem Code Java Basics - Anfänger-Themen 10
L Code optimieren Java Basics - Anfänger-Themen 14
N Hilfe, Code erklären Java Basics - Anfänger-Themen 7
M Bessere bzw. kürzere Variante für Code? Java Basics - Anfänger-Themen 2
Thallius Was ist an dem Code verkehrt? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Anzeige

Neue Themen


Oben