使用scanner.nextLine()

尝试从java.util.Scanner使用nextLine()方法时遇到了麻烦。

这是我试过的:

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

示例#1:这个例子按预期工作。 行String sentence = scanner.nextLine(); 在继续System.out.print("Enter an index:\t");之前,等待inputinputSystem.out.print("Enter an index:\t");

这产生输出:

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

例#2:这个例子不能按预期工作。 这个例子使用while循环和if-else结构来允许用户select要做什么。 一旦程序得到String sentence = scanner.nextLine(); 它不会等待input,而是执行System.out.print("Enter an index:\t");

这产生输出:

 Menu Options (1) - do this (2) - quit Please enter your selection: 1 Enter a sentence: Enter an index: 

这使得无法input一个句子。


为什么示例#2不能按预期工作? 唯一的区别 1和2是那个。 2有一个while循环和一个if-else结构。 我不明白为什么这会影响scanner.nextInt()的行为。

我认为你的问题是这样的

 int selection = scanner.nextInt(); 

只读取数字,而不是数字结尾或任何数字。 当你

 String sentence = scanner.nextLine(); 

这读取行号的余下部分(没有数字后,我怀疑)

尝试放置一个scanner.nextLine(); 在每个nextInt()之后,如果你打算忽略该行的其余部分。

每次你想要阅读某些东西,而不是放置一个额外的scanner.nextLine() ,因为你似乎想要接受每一个新的行上的input,你可能希望改变分隔符实际上只匹配换行符(而不是任何空格,这是默认的)

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

因此,要读取一行input,只需要scanner.next()具有与下一个{Int,Double,…}定界符相同的行为

与“nextLine()每一次”的不同之处在于,后者将接受作为索引的<space>3 3<space>3<space>whatever而前者只接受3拥有

不要试图用nextLine()来扫描文本; 在使用相同的扫描仪后使用nextInt()! Java Scanner不能很好地工作,许多Java开发人员select使用另一个Scanner作为整数。 如果需要,可以调用这些扫描仪scan1和scan2。

这是因为当你input一个数字,然后按Enter, input.nextInt()只消耗数字,而不是“行尾”。 原始数据types如int,double等不消耗“行尾”,因此“行尾”保留在缓冲区中,当执行input.next() ,会从第一个input缓冲区中消耗“行尾” 。 这就是为什么,你的String sentence = scanner.next()只消耗“行尾”,不等待从键盘读取。

提示:使用scanner.nextLine()而不是scanner.next()因为scanner.next()不读取键盘上的空格。 (从键盘给出一些空格后截断string,只在空格之前显示string。)

要么

 int selection = Integer.parseInt(scanner.nextLine());