Ich habe Probleme beim Versuch, die nextLine()-Methode von java.util.Scanner zu verwenden.
Hier ist, was ich versucht habe:
import java.util.Scanner;
class TestRevised {
public void menu() {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a sentence:\t");
String sentence = scanner.nextLine();
System.out.print("Enter an index:\t");
int index = scanner.nextInt();
System.out.println("\nYour sentence:\t" + sentence);
System.out.println("Your index:\t" + index);
}
}
Beispiel #1: Dieses Beispiel funktioniert wie vorgesehen. Die Zeile String sentence = scanner.nextLine();
wartet auf eine Eingabe, bevor sie mit System.out.print("Enter an index:\t");
fortfährt.
Dies erzeugt die Ausgabe:
Enter a sentence: Hello.
Enter an index: 0
Your sentence: Hello.
Your index: 0
// Example #2
import java.util.Scanner;
class Test {
public void menu() {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("\nMenu Options\n");
System.out.println("(1) - do this");
System.out.println("(2) - quit");
System.out.print("Please enter your selection:\t");
int selection = scanner.nextInt();
if (selection == 1) {
System.out.print("Enter a sentence:\t");
String sentence = scanner.nextLine();
System.out.print("Enter an index:\t");
int index = scanner.nextInt();
System.out.println("\nYour sentence:\t" + sentence);
System.out.println("Your index:\t" + index);
}
else if (selection == 2) {
break;
}
}
}
}
Beispiel #2: Dieses Beispiel funktioniert nicht wie vorgesehen. Dieses Beispiel verwendet eine while-Schleife und eine if - else-Struktur, um dem Benutzer die Wahl zu lassen, was er tun soll. Sobald das Programm bei String sentence = scanner.nextLine();
ankommt, wartet es nicht auf eine Eingabe, sondern führt stattdessen die Zeile System.out.print("Enter an index:\t");
aus.
Dies erzeugt die Ausgabe:
Menu Options
(1) - do this
(2) - quit
Please enter your selection: 1
Enter a sentence: Enter an index:
Das macht es unmöglich, einen Satz einzugeben.
Warum funktioniert Beispiel Nr. 2 nicht wie vorgesehen? Der einzige Unterschied zwischen Beispiel 1 und 2 ist, dass Beispiel 2 eine while-Schleife und eine if-else-Struktur hat. Ich verstehe nicht, warum dies das Verhalten von scanner.nextInt() beeinflusst.
Ich denke, Ihr Problem ist, dass
int selection = scanner.nextInt();
nur die Zahl liest, nicht aber das Zeilenende oder irgendetwas nach der Zahl. Wenn Sie deklarieren
String sentence = scanner.nextLine();
wird der Rest der Zeile mit der Zahl gelesen (und vermutlich nichts nach der Zahl)
Versuchen Sie, ein scanner.nextLine(); nach jeder nextInt() zu platzieren, wenn Sie den Rest der Zeile ignorieren wollen.
Anstatt jedes Mal, wenn Sie etwas lesen wollen, ein zusätzliches scanner.nextLine()
einzufügen, da Sie anscheinend jede Eingabe in einer neuen Zeile akzeptieren wollen, könnten Sie stattdessen das Trennzeichen so ändern, dass es tatsächlich nur auf Zeilenumbrüche passt (anstelle von Leerzeichen, wie es der Standard ist)
import java.util.Scanner;
class ScannerTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\\n");
System.out.print("Enter an index: ");
int index = scanner.nextInt();
System.out.print("Enter a sentence: ");
String sentence = scanner.next();
System.out.println("\nYour sentence: " + sentence);
System.out.println("Your index: " + index);
}
}
Um eine Eingabezeile zu lesen, brauchen Sie also nur scanner.next()
, das das gleiche Verhalten in Bezug auf das Trennzeichen hat wie next{Int, Double, ...}
Der Unterschied zum "nextLine() every time" Ansatz ist, dass letzterer als Index auch <space>3
, 3<space>
und 3<space>whatever
akzeptiert, während ersterer nur 3
in einer Zeile für sich allein akzeptiert
oder
int selection = Integer.parseInt(scanner.nextLine());