Java代码在Scanner hasNextLine上挂起

首先,我是java的新手,并试图在学校完成一项关于创建自动售货机的任务。 我的程序将2个文件作为cli参数,一个用于产品,另一个用于金钱。

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

(while (moneyTemp.hasNextLine());) 

我尝试使用断点在eclipse上进行调试,并注意到代码永远不会超过这一行。 在while循环中放置一个print语句,我没有得到输出,所以我知道它不是循环。

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美元比尔,5.0,中等,纸张,8
 PaperCurrency,1 Dollar Bill,100.0,medium,paper,16
 CoinCurrency,50 Cent Piece,0.5,大,金属,10
 CoinCurrency,季度,0.25,介质,金属,20
 CoinCurrency,迪梅,0.1%,小,金属,30
 CoinCurrency,镍,0.05%,小,金属,40
 CoinCurrency,竹,0.01,小,金属,50

任何帮助将非常感谢。 谢谢

从行中删除分号

  while (moneyTemp.hasNextLine()); 

Semicolom使while循环完成它的身体而不做任何意味着它像while(){}当while条件为true时什么也不做,因为你的条件是hasNextLine()它会一次又一次地检查同一行导致无限循环。

通过添加分号( ; ),您隐式地使while循环执行空块。 hasNextLine()不会更改扫描程序所基于的InputStream ,因此,在while循环体中没有任何内容,没有什么可以改变状态,循环将永远继续。

只需从while循环中删除分号,你应该没问题:

 while (moneyTemp.hasNextLine()) // no ; here! { numMoney++; moneyTemp.nextLine(); }