Java 代码在 Scanner hasNextLine 处挂起

Posted

技术标签:

【中文标题】Java 代码在 Scanner hasNextLine 处挂起【英文标题】:Java code hangs at Scanner hasNextLine 【发布时间】:2015-07-24 18:52:02 【问题描述】:

首先,我是 Java 新手,正在尝试完成学校关于创建自动售货机的作业。我的程序接收 2 个文件作为 cli 参数,一个用于产品,另一个用于金钱。

对于我的一生,我无法弄清楚为什么代码挂在第 42 行

 (while (moneyTemp.hasNextLine());)

我尝试使用断点在 Eclipse 上进行调试,并注意到代码从未超过这一行。在while循环中放置一个打印语句,我没有得到输出,所以我知道它没有循环。

java 文档说 hasNextLine 可以阻止等待用户输入,但由于我的源是一个文件,我不确定为什么会这样。请参阅下面的相关代码。

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class VendingMachine

    static Scanner input = new Scanner (System.in);

    public static void main(String[] args) 
    
        try
        
            Scanner productTempFile = new Scanner(new File(args[0]));
            Scanner moneyTemp = new Scanner(new File(args[1]));
            int numProducts = 0; //Number of products to be loaded to the machines
            int numMoney = 0;   //Number of money objects to be loaded in the machine

            while (productTempFile.hasNextLine()) //This block will get the number of products
            
                numProducts++;
                productTempFile.nextLine();
            
            productTempFile.close();


            Product[] invArray = new Product[numProducts];
            Scanner myFile = new Scanner(new File(args[0]));

            for(int i = 0; i < numProducts; i++)  //This block populates the array of products
            
                String inputLine = myFile.nextLine();                               
                String[] lineArray = inputLine.split(",");

                invArray[i] = new Product(lineArray[0], Double.valueOf(lineArray[1]), lineArray[2], lineArray[3],
                        Double.valueOf(lineArray[4]), Integer.valueOf(lineArray[5]));
             

            myFile.close();

            System.out.println("I'm here");

            while (moneyTemp.hasNextLine()); //This block gets the number of different money items
            
                numMoney++;
                moneyTemp.nextLine();               
            

下面是我提供的第二个文件,即 arg[1],其格式与第一个文件相同。

PaperCurrency,100 Dollar Bill,100.0,medium,paper,0 PaperCurrency,50 Dollar Bill,50.0,medium,paper,0 PaperCurrency,20 Dollar Bill,20.0,medium,paper,0 PaperCurrency,10 Dollar Bill,10.0,medium,paper,4 PaperCurrency,5 Dollar Bill,5.0,medium,paper,8 PaperCurrency,1 Dollar Bill,100.0,medium,paper,16 CoinCurrency,50 美分,0.5,大,金属,10 CoinCurrency,Quarter,0.25,medium,metal,20 CoinCurrency,Dime,0.1,small,metal,30 CoinCurrency,Nickel,0.05,small,metal,40 CoinCurrency,Penny,0.01,small,metal,50

任何帮助将不胜感激。 谢谢

【问题讨论】:

【参考方案1】:

从行中删除分号

 while (moneyTemp.hasNextLine());

分号使while循环完成其主体而不做任何事情意味着它就像while()当while条件为真时什么都不做,因为你的条件是hasNextLine()它一次又一次地检查同一行导致无限循环。

【讨论】:

啊,老分号在一段时间的末尾...我以前对此感到沮丧。 感谢您的快速回复。我不敢相信它这么小 :) 我在想它会是这么先进的东西。谢谢一百万。【参考方案2】:

通过添加分号 (;),您隐含地让 while 循环执行一个空块。 hasNextLine() 不会改变扫描器所基于的InputStream,所以由于while 循环的主体中没有任何内容,因此没有任何东西可以改变状态,并且循环将永远继续。

只需从while 循环中删除分号,就可以了:

while (moneyTemp.hasNextLine()) // no ; here!

    numMoney++;
    moneyTemp.nextLine();               

【讨论】:

这个答案与另一个答案有何不同?

以上是关于Java 代码在 Scanner hasNextLine 处挂起的主要内容,如果未能解决你的问题,请参考以下文章

java基础程序代码及Scanner和Random

《JAVA》 第一次作业

使用scanner类更改文本文件中的特定文本(java)

Java学习:Scanner类

新人,Java中关于Scanner的问题

java如何使用scanner