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

为什么当我在while循环中使用Scanner.hasNext()时会出现无限循环?[重复]

万俟小林
2023-03-14

我是Java新手。我正在尝试遍历一个文件并将每个字符串写入ArrayList。为此,我有如下代码:

public static void main(String[]args)throws IOException
{
    File customerData = new File("accountData.txt");
    Scanner fileReader = new Scanner(customerData);
    ArrayList<String> stringArrList = new ArrayList<String>();

    String currentWord = "";
    System.out.println("About to enter while loop");    

    while(fileReader.hasNext());
    {
        currentWord = fileReader.next();
        stringArrList.add(currentWord);
    }
    System.out.println("We have exited the while loop");
}

然而,由于某种原因,这段代码陷入了无限循环。即使我将打印语句作为当块的第一行,它也不会执行。

accountData.txt文件是这样排列的:

String String String String String
String String String String String
...

我已经读了很多遍,经常读到这是个问题,因为人们没有用Scanner.next()来移动指针,但我相信我正在这样做。我不知道哪里出了问题。

感谢您的帮助!

共有1个答案

羊煜
2023-03-14

这是一个问题,因为人们没有使用扫描仪。next()移动指针,但我相信我正在这样做

您将使用Scanner.next(),除了终止循环体。删除它。改变

while(fileReader.hasNext());
{
    currentWord = fileReader.next();
    stringArrList.add(currentWord);
}

while(fileReader.hasNext()) // <-- no semicolon
{
    currentWord = fileReader.next();
    stringArrList.add(currentWord);
}
 类似资料:
  • 我有一个看起来很简单的问题,但由于某种原因我无法绕过它。基本上我的程序正在导致一个无限循环,我不知道为什么。 下面是我陷入的特定循环: 当我运行它时,它总是问我输入列#。我给它一个数字,它接受这个数字,$response变为True,但while循环继续运行,就好像<code>的$response</code>为false一样。我是Perl新手,所以可能我遗漏了一些东西,但是($response=

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 问题内容: 当我在 while循环中 使用 try和catch 块时,我的程序有一个无限 循环 。 当我输入一个整数时,它运行良好并要求另一个输入,但是当我输入一个字符时,它将进入无穷循环。为什么会这样呢? 问题答案: 遇到无效输入时,由于nextInt()不使用无效令牌,因此程序进入无限循环。因此,导致该异常的任何令牌都将保留在该位置,并在下次尝试使用nextInt()时继续引发异常。 可以通过

  • 问题内容: 我一直在使用“ if”来测试自己的版本,并且一切似乎都正常。当然,如果使用signalAll()而不是signal(),这将导致严重崩溃,但是如果一次仅通知一个线程,这怎么会出错? 他们的代码在这里 -检查put()和take()方法;在Condition的JavaDoc顶部可以看到一个更简单,更重点的实现。 下面是我实施的相关部分。 PS我知道,通常,尤其是在这样的lib类中,应该让

  • 我想我的程序跳过了while循环,但我真的不确定到底发生了什么。该函数应该通过找到GCD,然后将分子和分母除以该数字来减少分数。 我得到分子和分母的绝对值,以确保如果分数是负数,我会在最后保持它。如果分子为0,则要求我返回(0,1)。问题是关于while循环。。。似乎它被完全跳过了。有什么建议吗?