Kann man den Code vereinfachen?

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.

[CODE lang="java" title="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();
}

}



}

}
}[/CODE]

[CODE lang="java" title="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;
}





}[/CODE]

Für eure Hilfe bin ich im Voraus dankbar.
 
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.
 
Auch die Bedingung !(nochmal=="a")||!(nochmal=="n") solltest Du nochmal überdenken (unabhängig davon, dass man Strings mit equals vergleicht).
 
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? 🙂
 
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).
 
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?
 
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.
 
Java:
public class ZahlNichtImErlaubtenIntervallException extends Exeption {
}

Java:
throw new ZahlNichtImErlaubtenIntervallException();
 
[CODE lang="java" title="ZahlNichtImErlaubtenIntervallException"]package summe;



public class ZahlNichtImErlaubtenIntervallException extends Exception{

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

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?
 
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;
        }
 
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😀.

[CODE lang="java" title="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;
}
}
}
}
[/CODE]

[CODE lang="java" title="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;
}
}[/CODE]

[CODE lang="java" title="Eigene Exception"]package summe;

public class EigeneException extends Exception {

public EigeneException() {
super("Ich bin Ex");

}
public EigeneException(String fehlermeldung) {
super(fehlermeldung);
}
}
[/CODE]
 
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.
 
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.
 
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.
 
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?

[CODE lang="java" title="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;
}[/CODE]

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

[CODE lang="java" title="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;

}

}[/CODE]

[CODE lang="java" title="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;
}

}
[/CODE]

[CODE lang="java" title="ZahlNichtImErlaubtenIntervallException"]package summe;

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

}
public ZahlNichtImErlaubtenIntervallException(String fehlermeldung) {
super(fehlermeldung);
}

}[/CODE]

Hoffentlich könnt ihr mir nochmal helfen.
 
[CODE lang="java" title="frageNutzerObNochmal"]
private static boolean frageNutzerObNochmal(Scanner tastatur, boolean end) {
...
default:
frageNutzerObNochmal(tastatur, end);
}
return false;
}
[/CODE]
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.
 
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);
  }
}
 
[CODE lang="java" title="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);

}

}[/CODE]
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
[CODE lang="java" title="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;

}

}[/CODE]
 
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?
[CODE lang="java" title="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);

}[/CODE]
 
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()
 
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.
 

Zurück
Oben