hasNext() 使循环无休止地运行,为什么?

hasNext() makes for loop run endlessly, why?

提问人:Tila tila 提问时间:11/19/2022 最后编辑:AnonymousTila tila 更新时间:11/20/2022 访问量:255

问:

有人可以解释一下,为什么这个循环无休止地运行? 我认为布尔值 **hasNext() ** 只有在不再有元素时才为真。因此,当我在循环中输入某些内容时,就像我输入的内容一样,也无穷无尽。 这些 nmbers 是什么?请解释


import java.util.Scanner;
public class Vocabulary {
    public static void main(String[] args) {
        Scanner standardInput = new Scanner(System.in);

        for(int i = 0; standardInput.hasNext(); i++){
            System.out.print(i);

        }

    }

}

我在互联网上研究了hasNext()。我知道它是什么,我知道for循环是如何工作的。但是我不知道为什么for循环中的hasNext会让程序无休止地运行。

编辑:

另一方面,此代码有效。为什么这段代码有效?

import java.util.Scanner;

 public class Sum {
    public static void main(String[] args) {

    
        Scanner standardInput = new Scanner(System.in);

        double sum = 0;
        
        while(standardInput.hasNext()) {
            double nextNumber = standardInput.nextDouble();
            sum += nextNumber;
        }
        System.out.println("The Sum is " + sum + ".");

        }
 }

java for 循环 java.util.scanner

评论

0赞 Anonymous 11/19/2022
为了在我的 Mac 上玩得开心,我以 .由于您无法读取 的任何输入,因此您的程序立即终止而不提供任何输出。java Vocabulary </dev/null/dev/null
0赞 Tila tila 11/19/2022
我不明白。有人向我解释说,“hasNext()”查看是否还有剩余元素。Oka,但是 while 循环呢?while(standardInput.hasNext())。但它适用于 while 循环?
0赞 Anonymous 11/19/2022
在带有条件的循环中,您需要执行一些操作来更改循环中的条件,否则它将无限运行或根本不运行(您的条件是 )。这是所有编程中的规则。standardInput.hasNext()
0赞 Anonymous 11/19/2022
A 和 a 循环在这里是相同的。whilefor
1赞 Pshemo 11/19/2022
@Tilatila 来自 hasNext() 的文档:“如果此扫描程序的输入中有另一个令牌,则返回 true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进到任何输入。在这种情况下,如果不关闭,可能仍会提供一些数据,因为用户可能正在控制台中创建/写入数据,并且尚未按回车键。System.in

答:

1赞 tquadrat 11/19/2022 #1

hasNext()如果有东西在等待被取走,则返回。但你永远不会拿起它,所以它一直呆在那里等待——无休止地等待,就像你的循环一样。trueScanner standardInput

评论

1赞 Andrey B. Panfilov 11/19/2022
我相信 TC 问 Q 的原因更明显:他忘记在循环体中调用 next/nextXXX。
0赞 tquadrat 11/20/2022
“you never pick it up” 还有什么意思?那个“捡起”的电话......nextXxxx()
1赞 corndog573 11/19/2022 #2

standardInput.hasNext()始终为真,这就是为什么你有一个无限循环。

hasNext()仅检查扫描程序中是否存在其他令牌,并且从一开始就不移动。例如,当输入字符串“StackOverflow”时,下一个标记始终是“StackOverflow”。

在您的案例中使用的一个问题是,使用 Scanner 会停止程序并等待输入,因此只要它接受了输入,它始终是正确的。hasNext()

在这种情况下,您似乎正在尝试迭代扫描仪输入的长度并每次打印当前字符数 - 最好将 的输出分配给变量并迭代该变量。有关示例,请参见下文:nextLine()

import java.util.Scanner;
class Vocabulary {
    public static void main(String[] args) {
        Scanner standardInput = new Scanner(System.in);
        String input = standardInput.nextLine();
        System.out.println("Scanner hasNext:" + standardInput.hasNext());  // we can see that hasNext pauses our program

        for (int i=0;i<input.length();i++) {
            System.out.print(i + " ");
        }
    }
}

输出如下所示:

StackOverflow
hasNext
Scanner hasNext:true
0 1 2 3 4 5 6 7 8 9 10 11 12 

评论

0赞 Tila tila 11/19/2022
嘿,非常感谢。我可以问你吗,我编辑了我的问题并放了另一个带有 while 循环的代码。在这个while循环中,我有相同的standardInput.hasNext()。但是此代码有效。有什么不同,我的意思是为什么这不会无限地进行?