Java - Warum bekomme ich eine Dauerschleife?

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Wozu soll die Schleife überhaupt dienen? Wenn du eine Zahl eingibst, wird die Schleife direkt beendet, da du "erfolg" gleich zu Anfang auf true setzt. Wenn du keine Zahl angibst, setzt du "erfolg" wieder auf false, wodurch die Schleife weiterläuft, beim nächsten Durchlauf aber natürlich wieder feststellt, dass keine Zahl eingegeben wurde und das wiederholt sich dann endlos.

dufterMike 
Fragesteller
 24.05.2018, 06:35

Aber müsste mir die schleife beim nächsten durchlauf nicht eigendlich die möglichkeit geben eine neue Eingabe zu machen (das scanner.nextInt() ist ja innerhalb der Schleife)?

Die schleife ist nur zu übungszwecken. Ich möchte den ablauf zu 100% verstehen. Hab auch ein Buch welches ich parallel durchlese. Dieses beantwortet mir aber nicht warum dieser Fehler entsteht. Festgestellt habe ich den Fehler bei einem Sinnvollem Algorithmus den ich bauen wollte. Von diesem habe ich dann nur den Teil behalten welcher den Fehler verursacht und ich nicht verstehe warum.

0
TheSnowGlobe  24.05.2018, 06:47
@dufterMike

Das Problem ist, dass der Scanner nicht zum nächsten Token weiter geht, wenn nextInt() einen Fehler wirft und somit immer das gleichen Token scannt (welches folglich immer wieder den gleichen Fehler erzeugt). Du müsstest also im catch-Teil noch die Methode next() aufrufen, damit er zum nächsten Token geht.

1
dufterMike 
Fragesteller
 24.05.2018, 07:13
@TheSnowGlobe

Aahaaa :-)
Vielen Dank.
Da lag das Problem. Wie es aussieht hatte ich "nextInt" wohl etwas falsch verstanden.

Habe es nun gelöst indem ich scanner.next() für die Eingabe verwendet habe und den Wert dann in einen Int umgewandelt hab.

0

So eine furchtbare Schleife habe ich schon lange nicht mehr gesehen^^

Wenn etwas kaputt gegangen ist (zB das Scanner-Objekt), dann hängst du, wie du selber gesehen hast, in einer Endlisschleife fest. Wenn du in den Catch-Fall einen BrakePoint legst kannst du ganz genau nachvollziehen, warum du nicht mehr aus der Schleife raus kommst.

dufterMike 
Fragesteller
 24.05.2018, 07:24

Vielen Dank für die Antwort. Habs mal so probiert.

Wahrscheinlich sieht man eine so furchtbare Schleife auch nur bei Anfängern (wie es aktuell bei mir der Fall ist, und wahrscheinlich auch mal bei dir so war) ;-)

1

new scanner in die Schleife

scanner.close in die Exception (catch)

Ist doch klar. Java geht ins Programm, setz "erfolg" auf false. Dann geht er in die Schleife, weil Erfolg false ist, setzt "erfolg" auf true.

Gibt dann "Bitte Ganzzahl ausgeben: ", scannt die eingabe. Wenn da nichts drin steht, dann geht er in catch, gibt aus "Dies war keine Ganzzahl" und setzt Erfolg auf false.. geht dann aber wieder in die Schleife und das Spiel geht wieder von vorne los weil er ja nur in die Schleife geht, wenn "erfolg != true" ist

dufterMike 
Fragesteller
 24.05.2018, 07:36

Danke für die Antwort. Das war aber nicht das Problem.
Das Problem war das er immer den nächsten Int-Token sucht weil ich statt mit "scanner.next()" mit "scanner.nextInt()" versucht habe eine Benutzereingabe durchzuführen.

Trotzdem vielen Dank für die Antwort :-)

0
  1. schreibt man nich einfach nur „!erfolg“ statt „erfolg != true“? ist irgendwie leichter zu lesen... grins
  2. offenbar ist die Scanner Instanz nach dem Fehler kaputt.. du muss sie also neu machen... und es dann wieder versuchen...
dufterMike 
Fragesteller
 24.05.2018, 06:17

Danke für die Antwort.

  1. ja :-) . Ist noch ein überbleibsel aus dem Versuch den Fehler zu beheben.
  2. Ich wusste nicht, dass das geht. Wodurch hab ich sie denn kaputt gemacht (wie kann man das verhindern). Und was meinst du mit "neu machen und wieder versuchen"?
0
user373h383  24.05.2018, 07:04
@dufterMike

Deine Schleife und die Eingabe in einen Try Catch legen, und im Catch-Fall den Scanner neu initialisieren.

2
RIDDICC  24.05.2018, 09:49
@dufterMike

durch die unzulässige Eingabe geht die Instanz offenbar kaputt... keine Ahnung wieso... das kann man nur verhindern, wenn man die Scanner Klasse verändern kann... einfach das „new Scanner“ unmittelbar vor dem „nextInt“ Aufruf...

0