Java 代码在 Scanner hasNextLine 处挂起
Java code hangs at Scanner hasNextLine
首先,我是 java 的新手,正在尝试完成学校布置的关于创建自动售货机的作业。我的程序将 2 个文件作为 cli 参数,一个用于产品,另一个用于金钱。
我这辈子都搞不懂为什么代码挂在第 42 行
(while (moneyTemp.hasNextLine());)
我尝试使用断点在 eclipse 上进行调试,发现代码从未超过这一行。将 print 语句放在 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 Cent Piece,0.5,large,metal,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
任何帮助将不胜感激。
谢谢
从行中删除分号
while (moneyTemp.hasNextLine());
Semicolom 使 while 循环完成它的主体而不做任何事情意味着它像 while(){}
当 while 条件为真时不做任何事情并且因为你的条件是 hasNextLine()
它一次又一次地检查同一行导致无限循环。
通过添加分号 (;
),您隐式地让 while
循环执行一个空块。 hasNextLine()
不会改变 InputStream
扫描器所基于的,所以由于 while
循环体中没有任何东西,所以没有什么可以改变状态,循环只会永远继续。
只需从 while
循环中删除分号,就可以了:
while (moneyTemp.hasNextLine()) // no ; here!
{
numMoney++;
moneyTemp.nextLine();
}
首先,我是 java 的新手,正在尝试完成学校布置的关于创建自动售货机的作业。我的程序将 2 个文件作为 cli 参数,一个用于产品,另一个用于金钱。
我这辈子都搞不懂为什么代码挂在第 42 行
(while (moneyTemp.hasNextLine());)
我尝试使用断点在 eclipse 上进行调试,发现代码从未超过这一行。将 print 语句放在 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 Cent Piece,0.5,large,metal,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
任何帮助将不胜感激。 谢谢
从行中删除分号
while (moneyTemp.hasNextLine());
Semicolom 使 while 循环完成它的主体而不做任何事情意味着它像 while(){}
当 while 条件为真时不做任何事情并且因为你的条件是 hasNextLine()
它一次又一次地检查同一行导致无限循环。
通过添加分号 (;
),您隐式地让 while
循环执行一个空块。 hasNextLine()
不会改变 InputStream
扫描器所基于的,所以由于 while
循环体中没有任何东西,所以没有什么可以改变状态,循环只会永远继续。
只需从 while
循环中删除分号,就可以了:
while (moneyTemp.hasNextLine()) // no ; here!
{
numMoney++;
moneyTemp.nextLine();
}