Java Scanner 在 while 循环中要求输入

问题描述 投票:0回答:3

所以我有这个程序:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
       
        Scanner scan = new Scanner(System.in);
        String name = "";
        while(name.isBlank()) {
            System.out.println("Enter your name: ");
            name = scan.next();     
        }
        System.out.println("Hello "+ name + "!");
    }
}

这个程序应该提示用户输入他们的名字。它应该不断提示他们,直到他们真正输入自己的名字,这意味着如果他们将输入字段保留为空并按 Enter 键,他们将再次收到提示。然而,这个程序并没有这样做。即使我按 ENTER 而不输入我的名字,程序也会冻结并且不会再次提示。

java loops while-loop java.util.scanner
3个回答
6
投票

对于您想要实现的行为,您应该使用

nextLine()
而不是
next()

正如文档所述:

扫描器使用分隔符模式将其输入分解为标记,默认情况下匹配空格。

next()
:从此扫描仪查找并返回下一个完整令牌。

nextLine()
:使扫描仪前进到当前行并返回跳过的输入。

next()
方法一旦遇到空格就会中断读取,例如:制表符 ( )、换行符 ( )、回车( )或适当的空格(还有其他字符属于“空白”定义)。当您在输入的开头不断输入空格或新行,而您的 Scanner 正在等待
next()
调用时,您的
Scanner
实例将简单地忽略它,因为尚未输入“任何内容”(什么也没有输入)但分隔符,不包含在返回值中)。
另一方面,当您调用 

nextLine()

方法时,此方法返回当前行或当前行的其余部分,具体取决于内部

Scanner
光标所在的位置,不包括行分隔符结尾。因此,每次当
nextLine()
等待输入时输入 Enter 时,这都会返回一个空的
String
,而不是
next()
方法,后者会阻塞,直到输入正确的输入和分隔符。
这是代码的调整版本:

public static void main(String[] args) { Scanner scan = new Scanner(System.in); String name = ""; while (name.isBlank()) { System.out.print("Enter your name: "); name = scan.nextLine(); } System.out.println("Hello " + name + "!"); }



2
投票
next()

的文档所指示的内容。


此方法可能会在等待扫描输入时阻塞

问题是,这是什么意思?这意味着 OP 的代码按照预期的方式工作。

Enter your name: [ENTER pressed] [ENTER pressed] [ENTER pressed] [ENTER pressed] [ENTER pressed] hector Hello hector!

因为按下 ENTER 时没有输入,所以对 
next()

方法的调用会阻塞等待输入。一旦输入,扫描仪输入就会被消耗并产生正确的输出。由于该方法是阻塞的,因此不会发生循环;从而使代码看起来像是被冻结了,而实际上并非如此。

    


2
投票
next()

方法来获取用户输入。实际上,当您不希望输入字符串为空时,可以使用

next()
。因此,如果您在输入非空内容之前按 Enter 键,
next()
会期待任何非空字符串(等待非空字符串)并忽略之前输入的所有空白字符。
对于您的情况,如果 

name

为空,您希望在每次输入后进行提示。在这种情况下,您需要使用

nextLine()
方法,如果用户按 Enter 键,它将移至下一条语句。然后检查 while 循环内的条件。
注意:

next()

仅接受单个单词,而

nextLine()
接受多个单词。
正确的代码是@Dan 在他的答案中提供的。

© www.soinside.com 2019 - 2024. All rights reserved.