当前位置: 首页 > 知识库问答 >
问题:

虽然循环不会无限循环,但for循环会无限循环?

施飞驰
2023-03-14

hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。”

当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效?

for循环:


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

        }

    }

}


while-loop:



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 + ".");

        }
 }


我读了定义,但仍然不明白为什么一个程序可以工作,而另一个却不行

共有3个答案

轩辕华辉
2023-03-14

这是因为这些代码行只检查是否要读取,而不是实际读取文件,因此不会前进文件指针。

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

}

而这几行代码实际上是使用Scanner对象读取类型double。

while(standardInput.hasNext()) {
    double nextNumber = standardInput.nextDouble();
    sum += nextNumber;
 }
司徒锐进
2023-03-14

for…循环中,您不会阅读标准输入来获取它,但您会在代码中检查它;您在中执行此操作…循环

要修复它,您应该在循环内添加扫描仪读数;

for(int i = 0; standardInput.hasNext(); i++){
    String str = standardInput.next(); // add reading
    System.out.print(i);
}
郎宏逸
2023-03-14

TLDR:这两个程序的行为不同,因为它们的代码不相等。

在while循环中,通过调用< code > standard input . next double()获得下一个标记。这将在每次迭代中更改< code > standard input . has next()的结果。

另一方面,for循环版本永远不会获得下一个令牌,因此hasNext()返回的值永远不会改变。

 类似资料:
  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类

  • 基本上,findNode()搜索其数据等于作为参数插入的字符串的节点,但当我调用outputList()方法(该方法返回屏幕上当前节点的字符串表示)时,它将继续无限循环。 outputList方法是: 如有任何帮助,我们将不胜感激。提前道谢。

  • 我对react钩子和效果有点陌生,在使用useEffect时遇到了问题 上面的代码是我构建的useEffect,用于使用axios获取数据库中的所有数据,并且我将所有数据放在一个称为reports的状态中。 但是当我console.log报告时,它会导致无限循环。我不知道为什么? 让我给你看一个我做的简单动作。 我正在做一个按钮,当它被点击时,报告的状态(按id)将被更新。 这是该州报告结构的样本

  • 问题内容: 为什么我在递归方法中遇到无限循环,而没有机会输入任何符号来破坏它? 如果您尝试创建错误(将字符串值输入键,然后尝试向其添加数字),则您将在控制台中获得无限的“错误”文本,而不是在第一次错误后,程序应再次询问该数字和然后才决定要做什么。 问题答案: 如果失败,则抛出异常,但不使用无效数据。从文档中: 当扫描程序抛出时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌

  • 我一直在玩React 16.7-alpha中的新钩子系统,当我处理的状态是一个对象或数组时,我陷入了useEffect中的无限循环中。 首先,我使用useState并用一个像这样的空对象启动它: 然后,在useffect中,我使用setObj再次将其设置为空对象。作为第二个参数,我正在传递[obj],希望如果对象的内容没有改变,它不会更新。但它一直在更新。我猜是因为无论内容是什么,它们总是不同的对

  • 你好,有人能解释一下为什么这会形成一个无限循环吗?谢谢!