尝试制作一个程序,该程序每月读取包含电话号码和费用的文件,并输出低于用户输入阈值的电话号码和费用。但是,运行时,在用户输入阈值后文件会无限期挂起。
代码如下:
import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;
public class exam1
{
public static void main (String[]args) throws IOException
{
Scanner G = new Scanner (System.in);
ArrayList<String> cellNum = new ArrayList<String>();
ArrayList<Float> cost = new ArrayList<Float>();
String filename = "";
int i=0, b=0;
float thresh = 0;
System.out.print("Enter filename: ");
filename = G.next();
File file = new File (filename);
Scanner fileInput = new Scanner (file);
System.out.print("\nEnter Cell Bill Threshold: ");
thresh = G.nextFloat();
while (fileInput.hasNextLine())
{
b++;
}
fileInput.close();
while (fileInput.hasNextLine())
{
for (i=0; i < b; i++)
{
cellNum.add(fileInput.next());
cost.add(fileInput.nextFloat());
}
fileInput.close();
}
for (i=0; i<cost.size();i++)
{
if (cost.get(i) > thresh )
{
cellNum.remove(i);
cost.remove(i);
}
}
System.out.print("\nBills exceeding threshold: ");
System.out.printf("\n%12s%8s", "Number", "Amount");
for (i=0; i<cost.size(); i++)
{
System.out.printf("%12s%8.2f", cellNum.get(i), cost.get(i));
}
}
}
正在读取的相关文件看起来像这样:
403-222-1023 37.24
403-983-1942 46.44
403-982-1952 50.35
我觉得我在错失一个显而易见的东西,但是任何帮助都会在这里得到体现。谢谢您的时间,很抱歉打扰您。
答案 0 :(得分:3)
在此循环中:
while (fileInput.hasNextLine())
{
b++;
}
您永远不会消耗fileInput
中的下一行,因此hasNextLine()
将始终返回true,从而导致无限循环。您需要在while循环中调用nextLine()
,以便hasNextLine()
有时会返回false。
然后您这样做:
fileInput.close();
while (fileInput.hasNextLine()) {
//...
fileInput.close();
}
您无法关闭源,然后尝试从中读取。完全读取Scanner
后,才关闭它。
如果您确定每一行都是指定格式,则可以执行以下操作:
while (fileInput.hasNextLine())
{
cellNum.add(fileInput.next());
cost.add(fileInput.nextFloat());
}
答案 1 :(得分:0)
问题出在while
循环
while (fileInput.hasNextLine())
{
b++;
}
fileInput.hasNextLine()
将始终返回true,因为您从未读过该行,并且将永远处于第一行。