所以我有这个程序:
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 而不输入我的名字,程序也会冻结并且不会再次提示。
对于您想要实现的行为,您应该使用
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 + "!");
}
next()
的文档所指示的内容。
此方法可能会在等待扫描输入时阻塞问题是,这是什么意思?这意味着 OP 的代码按照预期的方式工作。
Enter your name:
[ENTER pressed]
[ENTER pressed]
[ENTER pressed]
[ENTER pressed]
[ENTER pressed]
hector
Hello hector!
因为按下 ENTER 时没有输入,所以对
next()
方法的调用会阻塞等待输入。一旦输入,扫描仪输入就会被消耗并产生正确的输出。由于该方法是阻塞的,因此不会发生循环;从而使代码看起来像是被冻结了,而实际上并非如此。
next()
方法来获取用户输入。实际上,当您不希望输入字符串为空时,可以使用
next()
。因此,如果您在输入非空内容之前按 Enter 键,next()
会期待任何非空字符串(等待非空字符串)并忽略之前输入的所有空白字符。对于您的情况,如果 name
为空,您希望在每次输入后进行提示。在这种情况下,您需要使用
nextLine()
方法,如果用户按 Enter 键,它将移至下一条语句。然后检查 while 循环内的条件。注意:next()
仅接受单个单词,而
nextLine()
接受多个单词。正确的代码是@Dan 在他的答案中提供的。