Java - 错误:NoSuchElementException:找不到行

时间:2014-08-28 03:05:18

标签: java arrays exception

我需要从文件中读取字符串并将它们存储在数组中。但是,我的教授不允许该类使用ArrayList。所以我决定使用hasNextLine()运行一次文件并计算有多少行,然后创建一个数组并使其等于行数。

然后我做了一个while循环,检查i是否<=到数组,并给array[i]一个值fileInput.nextLine();。但是,我似乎经常收到错误NoSuchElementException: No line found

这是我的代码:

public static void main(String[] args) throws FileNotFoundException {
    int count = 0;
    int i = 1;

    //Read strings from a file and store in array
    Scanner fileInput = new Scanner(new File("file.dat"));

    while(fileInput.hasNextLine()) {
        fileInput.nextLine();
        count++;
    }
    String [] strArray = new String [count];

    while (i <= strArray.length) {
/*Error Here*/    strArray[i] = fileInput.nextLine();
            System.out.println(strArray[i]);
            i++;
    }
}
}

有人知道我的错误的解决方案吗?

P.S file.dat如下所示:

FRESH
MEAT
EVERY
SATURDAY
AT
TWELVE

4 个答案:

答案 0 :(得分:0)

发现错误。问题最终是我需要创建一个新的扫描程序类。

答案 1 :(得分:0)

这里的条件错了

while (i <= strArray.length) 

你可以写

while (i < strArray.length) 

答案 2 :(得分:0)

正如您所指出的,扫描仪无法重复使用。因为它已经到了文件的末尾。

以下是使用标准Java 7 NIO的替代解决方案:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.Arrays;

public
class Reader
{

    public static void main(String[] args) throws IOException
    {
        Path path = FileSystems.getDefault().getPath("file.dat");
        Object[] myLines = Files.readAllLines(path, StandardCharsets.US_ASCII).toArray();
        System.out.println(Arrays.toString(myLines));
    }
}

答案 3 :(得分:0)

如您所知,java中数组的索引以zero开头,因此最后一个元素索引始终为lengthOfArray - 1

当你这样做时

 while (i <= strArray.length) 

假设您的数组包含7个元素,因此第一个元素将处于零索引并继续添加元素。然后当一个条件成为7但仍然你的while循环允许它因为你指定了i <= strArray.length所以它试图在第七个索引添加一个元素但是数组的最后一个索引总是lengthOfArray - 1 in这个例子它将是6所以它找不到第七个索引并将抛出异常。

要解决此问题,只需删除等号

即可
    Scanner scannerForReading = new Scanner(new File("file.dat"));
    while (i < strArray.length && scannerForReading.hasNextLine()) {
        strArray[i] = scannerForReading.nextLine();
        System.out.println(strArray[i]);
        i++;
    }