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.
 

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

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

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? :)
 

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).
 

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?
 

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

Top Contributor
Java:
public class ZahlNichtImErlaubtenIntervallException extends Exeption {
}

Java:
throw new ZahlNichtImErlaubtenIntervallException();
 

Nutzer321

Mitglied
[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?
 
K

kneitzel

Gast
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;
        }
 

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😀.

[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]
 

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.
 

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

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.
 

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?

[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.
 

httpdigest

Top Contributor
[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.
 

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);
  }
}
 

Nutzer321

Mitglied
[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]
 

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?
[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]
 
K

kneitzel

Gast
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()
 

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
josfe1234 code vereinfachen Java Basics - Anfänger-Themen 15
K Code vereinfachen mit Schleife, aber wie genau? Java Basics - Anfänger-Themen 3
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
JaZuDemNo Code Erklärung Java Basics - Anfänger-Themen 3
M Connect-4-Code analysieren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
T Fehlercode bei code der das Alter ausrechnet Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
jhfjeh Strukturgramm in code Java Basics - Anfänger-Themen 11
D Tipps zum Code Java Basics - Anfänger-Themen 24
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
Say do-While Code Ausführung Java Basics - Anfänger-Themen 3
W Rückfrage zur Programmgestaltung (clean code) Java Basics - Anfänger-Themen 12
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
Pinhg Sound in Greenfoot Code einbinden Java Basics - Anfänger-Themen 2
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
A Wie könnte man diesen Code kürzer machen ? Java Basics - Anfänger-Themen 7
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
K Wie kann man diesen Code schnell und effizient interpretieren (Man hat nur 4 Minuten) Java Basics - Anfänger-Themen 3
R ISBN-10-Code überprüfen Java Basics - Anfänger-Themen 7
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
I HTML Code säubern Java Basics - Anfänger-Themen 4
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
S Compiler-Fehler Nicht adressierbarer Code ( Non-addressable code ) Java Basics - Anfänger-Themen 5
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
A Code Problem Java Basics - Anfänger-Themen 6
C Fehler im Code Java Basics - Anfänger-Themen 10
A Zu einem bestimmten Ort im Code springen Java Basics - Anfänger-Themen 11
L Ist der Code richtig Java Basics - Anfänger-Themen 3
nonickatall Ausführbarkeit von Code testen bzw. Remote Debugging Java Basics - Anfänger-Themen 4
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
G Programm Code Java Basics - Anfänger-Themen 5
C Code zusammenfassen Java Basics - Anfänger-Themen 5
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

Ähnliche Java Themen

Neue Themen


Oben