Also Du bekommst einen Stream von Zeichen. Ein besonderes Zeichen ist der Zeilenumbruch.
Dieser Zeilenumbruch ist wichtig, denn eine Eingabe wird erst ausgewertet, wenn der Zeilenumbruch eingegeben wurde.
Nun hat Scanner zwei Gruppen von Methoden:
- Methoden die nur einen Teil bis zum Zeilenumbruch auswerten OHNE den Zeilenumbruch
- Methoden, die eine ganze Zeile auswerten INCLUSIVE des Zeilenumbruchs.
Der erste Block kommt über einen vorhandenen Zeilenumbruch nicht hinweg. Du hast Deinen Code nicht gezeigt, aber ich gehe davon aus, dass du die Eingabe der Auswahl über nextInt() oder so machst. ==> Erste Gruppe! Der Zeilenumbruch bleibt erhalten!
Also was passiert:
Du gibst ein: "3\n" (\n steht für den Zeilenumbruch) Bei der Eingabe werden die Zeichen auch ausgeben, d.h. du siehst die 3 aber ebenso den Zeilenumbruch.
Aus dem Eingabepuffer wird nun die 3 gelesen, damit bleibt "\n" im puffer stehen.
Nun schreibst Du "Enter name:"
Nun kommt das nextLine() und heya: der Zeilenumbruch ist ja im Puffer. Also wird "\n" aus dem Puffer gelesen, Puffer ist nun leer.
Da nichts eingegeben wurde, bleiben wir in der gleichen Zeile ... und Du schreibst nun "Enter number:"
das nächste nextLine() kommt, im Eingabepuffer ist nichts. Also wartet das System auf die Eingabe.
Mit dem zweiten nextLine( ) auskommentiert passiert nun:
Nun schreibst Du "Enter name:"
Nun kommt erst das zusätzliche nextLine() -> das \n wird aus dem Puffer gelesen.
Nun kommt das zweite nextLine() und da der Puffer leer ist, wird gewartet ... und zwar bis der User die Enter Taste (= Zeilenumbruch) drückt. Dieser Zeilenumbruch wird auch angezeigt und der Cursor landet in der nächsten Zeile.
Du schreibst nun "Enter number:" - und da du durch die Enter Taste in der nächsten Zeile bist, schreibt er es eine Zeile tiefer.
Somit ist die Regel: Wenn Du bei der Eingabe das \n nicht berücksichtigst, dann musst du es vor der nächsten Eingabe entfernen.