使用 scanner.nextLine()

2022-08-31 10:33:10

我在尝试使用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");

这将生成输出:

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 结构来允许用户选择执行的操作。一旦程序到达 ,它就不会等待输入,而是执行行。String sentence = scanner.nextLine();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: 

这使得无法输入句子。


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


答案 1

我认为你的问题是

int selection = scanner.nextInt();

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

String sentence = scanner.nextLine();

这将读取带有数字的行的其余部分(我怀疑的数字后面没有任何内容)

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


答案 2

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

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

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

与“nextLine() every time”方法的不同之处在于,后者也接受作为索引,而前者只接受一行本身<space>33<space>3<space>whatever3


推荐