关于java:使用scanner.nextLine()

Using scanner.nextLine()

本问题已经有最佳答案,请猛点这里访问。

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

这是我尝试过的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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("
Your sentence:\t"
+ sentence);
        System.out.println("Your index:\t" + index);
    }
}

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

这会产生输出:

1
2
3
4
5
Enter a sentence:   Hello.
Enter an index: 0

Your sentence:  Hello.
Your index: 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Example #2
import java.util.Scanner;

class Test {
    public void menu() {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("
Menu Options
"
);
            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("
Your sentence:\t"
+ sentence);
                System.out.println("Your index:\t" + index);
            }
            else if (selection == 2) {
                break;
            }
        }
    }
}

示例#2:此示例无法按预期工作。 此示例使用while循环和if - else结构允许用户选择要执行的操作。 程序到达String sentence = scanner.nextLine();后,它不会等待输入,而是执行行System.out.print("Enter an index:\t");

这会产生输出:

1
2
3
4
5
6
7
Menu Options

(1) - do this
(2) - quit

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

这使得无法输入句子。

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


我认为你的问题是这样的

1
int selection = scanner.nextInt();

只读取数字,而不是数字后面的行尾或任何内容。当你申报时

1
String sentence = scanner.nextLine();

这将读取该行的剩余部分(在我怀疑的数字之后没有任何内容)

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


而不是每次想要读取一些额外的scanner.nextLine(),因为它似乎想要接受新行上的每个输入,您可能希望改为使用更改分隔符来实际匹配换行符(而不是任何空格,如是默认值)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Scanner;

class ScannerTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.useDelimiter("\
"
);

        System.out.print("Enter an index:");
        int index = scanner.nextInt();

        System.out.print("Enter a sentence:");
        String sentence = scanner.next();

        System.out.println("
Your sentence:"
+ sentence);
        System.out.println("Your index:" + index);
    }
}

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

与"nextLine()每次"方法的区别在于,后者将接受,作为索引333whatever,而前者仅接受3在一条线上


这是因为当你输入一个数字然后按Enter键时,input.nextInt()只消耗数字,而不是"行尾"。像int,double等原始数据类型不消耗"行尾",因此"行尾"保留在缓冲区中,当input.next()执行时,它从第一个输入的缓冲区消耗"行尾"。这就是为什么,你的String sentence = scanner.next()只消耗"行尾"并且不等待从键盘读取。

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


不要尝试使用nextLine()扫描文本;在使用相同扫描仪的nextInt()之后!它与Java Scanner不兼容,许多Java开发人员选择仅使用另一个Scanner进行整数。如果需要,您可以将这些扫描仪称为scan1和scan2。


要么

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