Java while(input.hasnextline)循环没有退出?

时间:2014-03-24 10:46:34

标签: java file io

所以我应该确定文本文件中的行数(包含数字的100行),然后创建一个包含行数的数组,但第一个while循环用于查找行数在文本文件中永远不会退出。第二个循环是完全相同的一个工作得很好。请帮帮我!

static void main(String[] args) throws Exception{
    java.io.File file = new java.io.File("seriesOfNumbers.txt"); //file instance                
    Scanner input = new Scanner(file); //Scanner
    int M =0 ;
    while (input.hasNextLine() && !input.equals(null))// ** Loop never exits, tried almost everything
    {
        k++;
    }
    double[] numberArray = new double[k];
    int V = 0;
    while (input.hasNextLine())// When I exit the first loop this one exits just fine
    {
        numberArray[j] = (double) input.nextInt();
        j++;
    }               

5 个答案:

答案 0 :(得分:1)

您永远不会在第一个循环中消耗您的输入,使用input.nextLine()执行此操作。

您现在正在循环,直到input.hasNextLine()变为false,但这种情况从未发生过,因为您没有使用输入。

答案 1 :(得分:0)

使用input.next()移动到下一行。在While条件下,您正在检查下一行,而不是null。那是它在无限循环中。

答案 2 :(得分:0)

在下面的代码中, 这是初始化

Scanner input = new Scanner(file); //Scanner

这是正在阅读

int M =0 ;
while (input.hasNextLine() && !input.equals(null))
{
    input.nextLine();  // Use this to advance the lines from scanner
    k++;
}

答案 3 :(得分:0)

在我看来,您可以使用apache.commons.io项目中的FileUtils类来完成这项工作。

static void main(String[] args) throws Exception{
    List<String> lines = FileUtils.readLines(new File("..."));

现在,如果你真的需要numberArray进行其他计算,你可以

    double[] d = new double[lines.size()];

或者您可以使用Collection来迭代

    for (String line : lines) {
        double n = Double.parseDouble(line);

要使用FileUtils,请查看http://commons.apache.org/proper/commons-io/

但是,你想要的只是知道你的代码有什么问题,你应该在你的第一个while循环中调用方法Scanner.nextLine()

答案 4 :(得分:0)

为了即使在消耗了必需的输入之后也可以停止while循环的无限循环,我们可以使用break语句。

这里是一个例子,

    while (scanner.hasNextLine()) {
            String[] arr = scanner.nextLine().split(" ");
            long[] ar = new long[n];
            for (int i = 0; i < n; i++) {
                ar[i] = Long.parseLong(arr[i]);
            }
            long result = sum(ar);
            System.out.println(result);
            break;
        }