繁体   English   中英

虽然循环没有按预期工作。 一切似乎都是正确的。 我该如何解决这个问题?

[英]While loop is not working as expected. Everything seems to be correct. How do I fix this problem?

所以我有这个程序:

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,程序也只是冻结并且不会再次提示。 请帮忙:(。

您应该使用nextLine()而不是next()来实现您想要实现的行为。

正如文档所述:

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

next() :从该扫描器中查找并返回下一个完整的标记。

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

next()方法一旦遇到空格就会中断读取,例如:制表符 (\t)、换行符 (\n)、回车符 (\r) 或适当的空格(还有其他字符属于空白定义)。 当您在输入的开头继续键入一个空格或一个新行,而您的Scanner正在期待next()调用的内容时,您的Scanner实例将简单地忽略它,因为尚未键入“任何内容”(除了分隔符,这不包括在返回值中)。

另一方面,当您调用nextLine()方法时,该方法返回当前行或当前行的 rest,具体取决于内部Scanner s cursor 的剩余位置,不包括末尾的任何行分隔符。 因此,每次您在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()方法来获取用户输入。 实际上next()是在您不希望输入字符串为空时使用的。 因此,如果您在输入非空内容之前按回车键,则next()会期待任何非空字符串(等待非空字符串)并忽略之前输入的所有空白字符。

对于您的情况,如果name为空,您希望在每次输入后提示。 在这种情况下,您需要改用nextLine()方法,如果用户按下回车键,它将移至下一条语句。 然后检查 while 循环内的条件。

注意: next()只接受单个单词,而nextLine()接受多个单词。

正确的代码是@Dan 在他的回答中提供的。

我想补充丹的回答。 这里的关键是next()的文档指示的内容。

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

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

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

因为按下 ENTER 时没有输入,所以调用next()方法会阻塞等待输入。 输入输入后,将使用扫描仪输入并生成正确的 output。 因为该方法是阻塞的,所以不会发生循环; 从而使代码看起来像是被冻结了,而实际上却没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM