Java 使用scanner.nextLine()

Java 使用scanner.nextLine(),java,java.util.scanner,Java,Java.util.scanner,我在尝试使用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

我在尝试使用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语句=scanner.nextLine()等待输入,然后继续执行
System.out.print(“输入索引:\t”)

这将产生以下输出:

Enter a sentence:   Hello.
Enter an index: 0

Your sentence:  Hello.
Your index: 0
Menu Options

(1) - do this
(2) - quit

Please enter your selection:    1
Enter a sentence:   Enter an index: 

示例#2:此示例未按预期工作。本例使用while循环和if-else结构允许用户选择要执行的操作。一旦程序到达
String语句=scanner.nextLine(),它不等待输入,而是执行行
System.out.print(“输入索引:\t”)

这将产生以下输出:

Enter a sentence:   Hello.
Enter an index: 0

Your sentence:  Hello.
Your index: 0
Menu Options

(1) - do this
(2) - quit

Please enter your selection:    1
Enter a sentence:   Enter an index: 
这样就不可能输入一个句子



为什么示例2没有达到预期效果?Ex.1和Ex.2之间唯一的区别是Ex.2有一个while循环和if-else结构。我不明白这为什么会影响scanner.nextInt()的行为

我想你的问题是

int selection = scanner.nextInt();
只读取数字,而不是行尾或数字后面的任何内容。当你申报时

String sentence = scanner.nextLine();
这将读取带有数字的行的其余部分(在我怀疑的数字后面没有任何内容)


尝试放置扫描仪。nextLine();如果要忽略行的其余部分,请在每次nextInt()之后执行。

而不是每次要读取内容时都放置一个额外的
扫描仪。nextLine()
,因为您似乎希望在新行上接受每个输入,因此您可能希望改为更改分隔符以实际仅匹配新行(而不是任何空白,这是默认值)

因此,要读取一行输入,您只需要具有与next{Int,Double,…}相同的行为分隔符的
scanner.next()

“nextLine()every time”方法的不同之处在于,后者将接受
3
3
3无论什么
,而前者只接受一行上的
3
,或者

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

这是因为当您输入一个数字,然后按enter键时,
input.nextInt()
只使用数字,而不使用“行尾”。int、double等原始数据类型不使用“行尾”,因此“行尾”保留在缓冲区中,当
input.next()
执行时,它使用“行尾”这就是为什么,您的
字符串语句=scanner.next()
只消耗“行尾”,而不等待从键盘读取


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

不要尝试用nextLine()扫描文本;在使用nextInt()后)使用相同的扫描器!它与Java扫描器不兼容,许多Java开发人员选择只使用另一个扫描器来处理整数。如果需要,可以调用这些扫描器scan1和scan2。

这是正确的。回车符不会被
nextInt
使用。解决方法是使用您的解决方案或使用一种模式来包含两个CRs和nd其他分隔符。相关:在示例#2中,在这一行之前,String语句=scanner.nextLine();在sc.nextLine()行下面添加;