文件扫描程序无限期挂起

时间:2018-11-30 16:37:10

标签: java

尝试制作一个程序,该程序每月读取包含电话号码和费用的文件,并输出低于用户输入阈值的电话号码和费用。但是,运行时,在用户输入阈值后文件会无限期挂起。

代码如下:

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

我觉得我在错失一个显而易见的东西,但是任何帮助都会在这里得到体现。谢谢您的时间,很抱歉打扰您。

2 个答案:

答案 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,因为您从未读过该行,并且将永远处于第一行。