Endlosschleife bei User Input mit try Scanner

javapingu

Mitglied
Liebe Community,

ich habe seit 4 Stunden einen Bug (wahrscheinlich Logikfehler), bin aber leider nicht in der Lage diesen selbstständig zu finden - trotz aller größter Bemühungen :( .
Da ich nun mittlerweile tatsächlich nicht mehr weiter weiß würde ich euch gerne um etwas Hilfe bitten.

Ich möchte den Tag und den Monat vom User einlesen und die Kombination validieren - dabei jedoch nur eine Methode nutzen um es möglichst Redundanzfrei zu halten.
Der Fehler steckt meiner Meinung nach in Zeile 31-36.
Erwartetes Verhalten:
Nach der erfolgreichen Eingabe des Tages, wird mit dem Monat gleich verfahren - es wird geprüft ob der Monat im Bereich 1-12 liegt und eine Zahl ist, solange bis eine gültige Eingabe erfolgt.

Erhaltenes Verhalten:
Eine Endlosschleife mit folgendem Output: [CODE lang="java" title="output"]Monat (1-12): Bitte eine ganze Zahl eingeben.[/CODE]
Anschließend die Fehlermeldung:
[CODE lang="java" title="error_msg"]Exception in thread "main" java.util.regex.PatternSyntaxException: Stack overflow during pattern compilation near index 138
(([-+]?(((((?i)[0123456789\[...] at java.base/java.util.regex.Pattern.error(Pattern.java:2027)[/CODE]

Mein Code lautet wie folgt:

[CODE lang="java" title="Der problematische Code"]import java.util.Scanner;

/**
*
* @author pingu
*/

/**
* Eine Klasse die vom User die Nutzereingaben einliesst, zu einem String
* konkateniert und diesen am Ende der Eingaben ausgibt
*/
public class Jahreszeit {

public static void main(String[] args) {
Jahreszeit jahreszeit = new Jahreszeit();
int tag = jahreszeit.userInput(true, true, 1, 31);
System.out.println(tag);
int monat = jahreszeit.userInput(true, true, 1, 12);
System.out.println(monat);
}

/**
* Eine Methode die eine Loop hat. Dabei ist die Haeufigkeit des durchlaufens
* vom UserInput abhaengig
*/
public int userInput(boolean inputInt, boolean valide, int min, int max) {
int dateValue;
errorNaN(inputInt, valide); // Nur wenn !int || ungültig - error_msg
try (Scanner userInput = new Scanner(System.in)) { // nur wenn valider Tag return, sonst repeat
System.out.print(max > 12 ? "Tag (1-31): " : "Monat (1-12): ");
return ((inputInt = userInput.hasNextInt())
&& (valide = validator(dateValue = userInput.nextInt(), min, max)) ? dateValue
: userInput(inputInt, valide, min, max));
} // Scanner close mit try
}

/** Eine Methode die den UserInput (Monat, Tag) validiert */
public boolean validator(int dateValue, int min, int max) {
return (dateValue >= min && dateValue <= max) ? true : false;
}

/** Eine Methode die User darauf hinweisst einen validen int einzugeben */
public static void errorNaN(boolean inputInt, boolean valide) {
System.out.print(!inputInt ? "Bitte eine ganze Zahl eingeben.\n" : "");
System.out.print(inputInt && !valide ? "Nicht im geforderten Bereich.\n" : "");
}

}[/CODE]

Ich verstehe leider nicht, weshalb eine Endlosschleife entsteht, denn bei der Übergabe des Parameters für den monat sind ja beide booleans inputInt und valide true...da ich meinen Fehler nicht selbstständig finden konnte, kann ich das Problem leider auch nicht sauber lösen :(
Über eine Hilfe mit Erklärung, weshalb der Fehler entsteht (womöglich weiß ich etwas noch nicht oder bin blind) und Hinweise die mich in die richtige Richtung zur Fehlerbehebung "schubsen" wäre ich unendlich dankbar...

Vielen, vielen Dank im voraus und einen schönen & stressfreien Abend
 

mrBrown

Super-Moderator
Mitarbeiter
Kannst du den ganzen Stacktrace der Fehlermeldung posten?

(der sieht interessant aus, Fehler hast du in deinem Code aber noch andere, aber dazu später mehr :) )
 

javapingu

Mitglied
Kannst du den ganzen Stacktrace der Fehlermeldung posten?
Selbstverständlich, das wäre:

[CODE lang="java" title="gesamte Fehlermeldung"]Monat (1-12): Bitte eine ganze Zahl eingeben.
Monat (1-12): Bitte eine ganze Zahl eingeben.
Monat (1-12): Bitte eine ganze Zahl eingeben.
Monat (1-12): Bitte eine ganze Zahl eingeben.
Monat (1-12): Exception in thread "main" java.util.regex.PatternSyntaxException: Stack overflow during pattern compilation near index 155
(([-+]?(((((?i)[0123456789\p{javaDigit}])++)|([\p{javaDigit}&&[^0]]((?i)[0123456789\p{javaDigit}])?((?i)[0123456789\p{javaDigit}])?(\x{2e}((?i)[0123456789\p{javaDigit}])((?i)[0123456789\p{javaDigit}])((?i)[0123456789\p{javaDigit}]))+)))))|(((((?i)[0123456789\p{javaDigit}])++)|([\p{javaDigit}&&[^0]]((?i)[0123456789\p{javaDigit}])?((?i)[0123456789\p{javaDigit}])?(\x{2e}((?i)[0123456789\p{javaDigit}])((?i)[0123456789\p{javaDigit}])((?i)[0123456789\p{javaDigit}]))+)))|(\Q-\E((((?i)[0123456789\p{javaDigit}])++)|([\p{javaDigit}&&[^0]]((?i)[0123456789\p{javaDigit}])?((?i)[0123456789\p{javaDigit}])?(\x{2e}((?i)[0123456789\p{javaDigit}])((?i)[0123456789\p{javaDigit}])((?i)[0123456789\p{javaDigit}]))+)))
^
at java.base/java.util.regex.Pattern.error(Pattern.java:2027)
at java.base/java.util.regex.Pattern.<init>(Pattern.java:1430)
at java.base/java.util.regex.Pattern.compile(Pattern.java:1068)
at java.base/java.util.Scanner$PatternLRUCache.forName(Scanner.java:3047)
at java.base/java.util.Scanner.integerPattern(Scanner.java:446)
at java.base/java.util.Scanner.hasNextInt(Scanner.java:2158)
at java.base/java.util.Scanner.hasNextInt(Scanner.java:2138)
at Jahreszeit.userInput(Jahreszeit.java:33)
at Jahreszeit.userInput(Jahreszeit.java:35)
at Jahreszeit.userInput(Jahreszeit.java:35)
at Jahreszeit.userInput(Jahreszeit.java:35)
at Jahreszeit.userInput(Jahreszeit.java:35)
at Jahreszeit.userInput(Jahreszeit.java:35)
at Jahreszeit.userInput(Jahreszeit.java:35)
at Jahreszeit.userInput(Jahreszeit.java:35)
at Jahreszeit.userInput(Jahreszeit.java:35)
at Jahreszeit.userInput(Jahreszeit.java:35)[/CODE]

Vielen Dank :)
 

temi

Top Contributor
da ich meinen Fehler nicht selbstständig finden konnte, kann ich das Problem leider auch nicht sauber lösen
Du solltest erst mal versuchen etwas übersichtlicher zu programmieren.

Sowas wie
Java:
return ((inputInt = userInput.hasNextInt())
                    && (valide = validator(dateValue = userInput.nextInt(), min, max)) ? dateValue
                            : userInput(inputInt, valide, min, max));
ist nicht sehr gut zu lesen und der Rest ist nicht viel besser.
 

mrBrown

Super-Moderator
Mitarbeiter
Ahh. Das Hauptproblem dürfte sein, dass man den Scanner nicht schließen darf und nur eine einzige Instanz öffnen sollte. Wenn man den Scanner schließt, schließt man auch System.in, und das kann man nie wieder öffnen. Außerdem puffert Scanner intern die Eingabe, wenn man mehrere hat "klauen" diese sich die Eingabe.
 

temi

Top Contributor
Dieses lässt sich vereinfachen:
Java:
    /** Eine Methode die den UserInput (Monat, Tag) validiert */
    public boolean validator(int dateValue, int min, int max) {
        return (dateValue >= min && dateValue <= max) ? true : false;
    }
zu
Java:
    /** Eine Methode die den UserInput (Monat, Tag) validiert */
    public boolean validator(int dateValue, int min, int max) {
        return (dateValue >= min && dateValue <= max);
    }
Das ist aber nebensächlich.
 

javapingu

Mitglied
Du solltest erst mal versuchen etwas übersichtlicher zu programmieren.

Sowas wie
Java:
return ((inputInt = userInput.hasNextInt())
                    && (valide = validator(dateValue = userInput.nextInt(), min, max)) ? dateValue
                            : userInput(inputInt, valide, min, max));
ist nicht sehr gut zu lesen und der Rest ist nicht viel besser.
Dankeschön, ja es ist dieses mal tatsächlich unübersichtlich geworden, das tut mir wirklich leid - ich hatte versucht es so kurz wie möglich zu fassen mit ternären Operatoren und habe mich wohl in dem Versuch verlaufen.
Ich werde versuchen in Zukunft die übersichtlichere Variante vorzuziehen (und diese Variante wahrscheinlich nochmal übersichtlicher zu überarbeiten) :| Und dankeschön für den Kürzungstipp :)
 

javapingu

Mitglied
Ahh. Das Hauptproblem dürfte sein, dass man den Scanner nicht schließen darf und nur eine einzige Instanz öffnen sollte. Wenn man den Scanner schließt, schließt man auch System.in, und das kann man nie wieder öffnen. Außerdem puffert Scanner intern die Eingabe, wenn man mehrere hat "klauen" diese sich die Eingabe.
Vielen, vielen Dank für den Tipp - ich versuche dies zu beheben =)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Hilfe bei Endlosschleife Java Basics - Anfänger-Themen 2
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
noah1407 endlosschleife Java Basics - Anfänger-Themen 7
G Endlosschleife keine Rückgabe Java Basics - Anfänger-Themen 36
sserio Endlosschleife ja nein? Java Basics - Anfänger-Themen 13
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
O Endlosschleife abbrechen Java Basics - Anfänger-Themen 10
S Endlosschleife beim Ausgeben einer LinkedList Java Basics - Anfänger-Themen 2
S Interpreter-Fehler Endlosschleife zur Laufzeit aber warum? Java Basics - Anfänger-Themen 15
T Erste Schritte Endlosschleife & wozu braucht man /* und */ Java Basics - Anfänger-Themen 19
J Endlosschleife bei Try-Catch? Java Basics - Anfänger-Themen 3
S Endlosschleife - Warum? Java Basics - Anfänger-Themen 1
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
C Collatzfolge endlosschleife. Java Basics - Anfänger-Themen 4
D Array in Endlosschleife überschreibt vorherige Werte Java Basics - Anfänger-Themen 4
E Eulersche Zahl berechnen, Endlosschleife Java Basics - Anfänger-Themen 2
N Endlosschleife... Warum? Java Basics - Anfänger-Themen 12
P Kapselung Problem - Endlosschleife Java Basics - Anfänger-Themen 10
M Endlosschleife bricht durch switch ab Java Basics - Anfänger-Themen 17
D Endlosschleife und ich komme nicht raus! Java Basics - Anfänger-Themen 8
N Erste Schritte Endlosschleife und Exception Java Basics - Anfänger-Themen 5
R Endlosschleife nach InputMismatchException Java Basics - Anfänger-Themen 2
S Endlosschleife? Java Basics - Anfänger-Themen 2
T Endlosschleife Java Basics - Anfänger-Themen 2
Z Endlosschleife Java Basics - Anfänger-Themen 6
T Endlosschleife Java Basics - Anfänger-Themen 12
H Wieso ist das eine Endlosschleife? Java Basics - Anfänger-Themen 8
StupidAttack Endlosschleife, Sockets Java Basics - Anfänger-Themen 2
C ungewollte Abbrüche in einer Endlosschleife Java Basics - Anfänger-Themen 6
E komische endlosschleife Java Basics - Anfänger-Themen 6
7 Endlosschleife pausieren Java Basics - Anfänger-Themen 11
F .readLine() erzeugt endlosschleife Java Basics - Anfänger-Themen 4
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
F Falscheingabe abfangen - Endlosschleife Java Basics - Anfänger-Themen 5
R warum endlosschleife? Java Basics - Anfänger-Themen 7
W Fakultät, warum Endlosschleife? Java Basics - Anfänger-Themen 15
S JTable Endlosschleife Java Basics - Anfänger-Themen 5
J Aus endlosschleife kommen Java Basics - Anfänger-Themen 5
R Endlosschleife verhindert das Schließen des Fensters Java Basics - Anfänger-Themen 10
Povlsen84 Endlosschleife Java Basics - Anfänger-Themen 5
V Bubble Sort endet in Endlosschleife Java Basics - Anfänger-Themen 4
Antoras Endlosschleife Java Basics - Anfänger-Themen 8
J Wartezustand in Endlosschleife - bessere Alternativen Java Basics - Anfänger-Themen 20
H Problem beim Einlesen einer Datei (Endlosschleife ?) Java Basics - Anfänger-Themen 3
N Endlosschleife? Java Basics - Anfänger-Themen 3
V mehrere Threads starten + Endlosschleife Java Basics - Anfänger-Themen 3
I Hilfe wer findet mein Fehler in bei der Endlosschleife Java Basics - Anfänger-Themen 7
G Sound/Endlosschleife/Abbruchproblem Java Basics - Anfänger-Themen 3
G HappyNumbers - Endlosschleife Java Basics - Anfänger-Themen 11
0 Endlosschleife beim Integer Array mischen? Java Basics - Anfänger-Themen 3
M OutputStream funktioniert nur in Endlosschleife ? Java Basics - Anfänger-Themen 4
G Endlosschleife, aber warum? Java Basics - Anfänger-Themen 12
G Endlosschleife beenden Java Basics - Anfänger-Themen 10
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
W User zwischen Optionen wählen lassen Java Basics - Anfänger-Themen 1
JD_1998 Vektorrechner; User Input -> Index out of bounds Java Basics - Anfänger-Themen 3
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
R Wie überprüfen wann der User online oder offline ist? Java Basics - Anfänger-Themen 5
B Import Tabelle - Struktur durch User einstellbar Java Basics - Anfänger-Themen 4
C Wie kann ich einen User Input mit einer If-Anweisung verbinden? Java Basics - Anfänger-Themen 5
I gemeinsame Config-Datei für alle Windows-User Java Basics - Anfänger-Themen 5
J Dateien für anderen User "mitgeben" Java Basics - Anfänger-Themen 1
M "Per-User"-Variable Java Basics - Anfänger-Themen 2
P Ein Array mit der Eingaber der User füllen und ausgeben Java Basics - Anfänger-Themen 6
Z User/passwort eingabe...Help! Java Basics - Anfänger-Themen 4
J Array manuell vom User eingeben, Zeilenweise Java Basics - Anfänger-Themen 2
R User Input wird übersprungen?! Java Basics - Anfänger-Themen 17
N User Eingabe mit Zeile aus TextFile vergleichen Java Basics - Anfänger-Themen 13
H Erste Schritte 2 User Interfaces für eine Anwendung Java Basics - Anfänger-Themen 7
S Input/Output Welche Möglichkeiten Eingabe von User abfragen Java Basics - Anfänger-Themen 5
D User - Interface über die Console Java Basics - Anfänger-Themen 14
N User wechseln? Java Basics - Anfänger-Themen 3
3 User erstellen / Oracle Content DB Java Basics - Anfänger-Themen 2
G Startmenü und user.dir Java Basics - Anfänger-Themen 14
P System.getProperty("user.dir") beeinflussen Java Basics - Anfänger-Themen 3
kulturfenster User soll Radius von Kugel bestimmen Java Basics - Anfänger-Themen 4
K User Aktivität überwachen Java Basics - Anfänger-Themen 9
I User anlegen und Sytempfade zuordnen Java Basics - Anfänger-Themen 4
I Wie kann man in root -User wechseln? Java Basics - Anfänger-Themen 16
S Windows User != Server User auslesen Java Basics - Anfänger-Themen 19
H Dienst beenden als normaler User Java Basics - Anfänger-Themen 3
X Property user.name über Konsole verändern Java Basics - Anfänger-Themen 6
M JTable Zellen für User sperren Java Basics - Anfänger-Themen 4
M Scanner Input mit if überprüfen Java Basics - Anfänger-Themen 5
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
I Array übernimmt immer den letzten Input. Java Basics - Anfänger-Themen 14
L Wie Input auf verschiedene Kriterien hin überprüfen? Java Basics - Anfänger-Themen 3
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
J Sharing Audio input Java Basics - Anfänger-Themen 6
J Fragen zu Input/Output Java Basics - Anfänger-Themen 3
steven789hjk543 Input mit if-else Java Basics - Anfänger-Themen 23
O Input/Output newbile und keine Ahnung! Java Basics - Anfänger-Themen 16
D [AES] input not multiple of 16 Java Basics - Anfänger-Themen 2
J Input/Output Input als Parameter an Methoden übergeben Java Basics - Anfänger-Themen 23
J Input-Variable nicht sichtbar Java Basics - Anfänger-Themen 2
T '>' vor Console input Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben