“线程”main“中的异常 java.util.NoSuchElementException:未找到行” 在循环中循环读取文件时

'Exception in thread "main" java.util.NoSuchElementException: No line found' When iterating through a loop reading a file

提问人:TorusWithSprinkles 提问时间:12/4/2019 最后编辑:TorusWithSprinkles 更新时间:12/4/2019 访问量:303

问:

Java 菜鸟在这里。因此,我正在编写一个程序,该程序从文本文件中读取数据,并将数据存储到对象数组中。循环的每次迭代读取 4 条数据(一个名称(字符串)和 3 个相应的数字(双精度))。然后,它创建一个调用构造函数的对象,并将一个对象存储在数组的每个元素中。有 10 个单独的项目,因此文本文件中有 40 行。

出于某种原因,我的循环正确读取了前 9 个项目(或 36 行),但它不会读取最后 4 行。我在循环中写了一个打印语句,看看发生了什么,这就是它的样子。我还尝试了 for 循环和 while 循环。这是我写的方法:

    public static PlanetData[] readFile() throws IOException
    {
        String name;
        double radius, flux, distance;

        final int ARRAY_SIZE = 10;
        PlanetData[] planArray = new PlanetData[ARRAY_SIZE];

        File planetFile = new File("PlanetData.txt");
        Scanner planetFileInput = new Scanner(planetFile);

        int index = 0;
        while(planetFileInput.hasNext() && index < planArray.length)
        {
            name     = planetFileInput.nextLine();
            radius   = planetFileInput.nextDouble();
            flux     = planetFileInput.nextDouble();
            distance = planetFileInput.nextDouble();
            planetFileInput.nextLine();

            System.out.println(index + ":  " + name + " " + radius + " " + flux + " " + distance);

            planArray[index] = new PlanetData(name, radius, flux, distance);

            index++;
        }



        return planArray;

我收到以下错误:

0:  Proxima Cen b, 1.1, 0.66, 4.2
1:  Kapteyn b*,    1.6, 0.43, 13.0
2:  GJ 667 C c,    1.5, 0.88, 22.0
3:  GJ 667 C f*,   1.4, 0.56, 22.0
4:  TRAPPIST-1 e,  0.9, 0.65, 39.0
5:  TRAPPIST-1 f,  1.0, 0.38, 39.0
6:  LHS 1140 b,    1.4, 0.41, 41.0
7:  Kepler-1229 b, 1.4, 0.49, 769.0
8:  Kepler-442 b,  1.3, 0.7,  1115.0

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at PlanetClient.readFile(PlanetClient.java:57)
    at PlanetClient.main(PlanetClient.java:13)

编辑:这是文本文件中的数据:

Proxima Cen b
1.1
0.66
4.2
Kapteyn b*
1.6
0.43
13
GJ 667 C c
1.5
0.88
22
GJ 667 C f*
1.4
0.56
22
TRAPPIST-1 e
0.9
0.65
39
TRAPPIST-1 f
1
0.38
39
LHS 1140 b
1.4
0.41
41
Kepler-1229 b
1.4
0.49
769
Kepler-442 b
1.3
0.7
1115
Kepler-62 f
1.4
0.39
1200
Java 数组 java.util.scanner nosuchelementexception

评论

1赞 RealSkeptic 12/4/2019
可能只是文件中的最后一行不以换行符结尾。

答:

1赞 CuriousOne 12/4/2019 #1

第 8 个条目是您PlanetData.txt的最后一个条目吗?看起来您在设置第一个条目的名称时调用了下一行,然后在条件的末尾再次调用。这似乎会导致您的代码跳过所有其他条目,然后尝试读取最后一个条目之后的行。你能在PlanetData.txt发布数据吗?谢谢

评论

0赞 TorusWithSprinkles 12/4/2019
谢谢你的帮助!因此,第 8 个条目(或第 9 个项目)是文本文件中倒数第二个条目。文本文件中还剩下 4 行(即一个项目/对象),代码没有读取。您能解释一下“在设置第一个条目的名称时您正在调用下一行”是什么意思吗?对不起,我仍然是一个 java 菜鸟。我也会尝试用全文文件编辑原始帖子,对不起!再次感谢,
0赞 CuriousOne 12/4/2019
当然,当执行“name = planetFileInput.nextLine();”行时,它会导致您的扫描仪从字面上转到下一行。然后,您读取各种值并再次调用“planetFileInput.nextLine();”,这会导致您的扫描仪对象再次转到下一行。这导致每次迭代都会跳过一行,因此,在最后,您尝试读取不存在的行。从理论上讲,您可以在文本文件中添加一行额外的行,此错误就会消失......但是,你的星球数据的完整性仍然会遇到很大的问题。
0赞 TorusWithSprinkles 12/4/2019
哦,哇,是的,在文本文件的末尾添加一个新行可以解决问题!我没有意识到名称分配会导致它转到下一行,但这是有道理的。因此,使用额外的行,似乎一切正常,所有数据都是正确的。但是有什么方法可以在不编辑文本文件的情况下解决这个问题呢?从理论上讲,我希望不必打开或编辑它,但我无法弄清楚如何在不这样做的情况下正确阅读所有内容。再次感谢您的帮助!
1赞 CuriousOne 12/4/2019
这实际上取决于您如何存储数据。根据您的描述,您有与交叉线相关的值。如果返回的所有数据都是正确的,那么可以考虑在调用“planetFileInput.nextLine();”之前添加“if(!planetFileInput.hasNextLine()){break;}”。
0赞 CuriousOne 12/14/2019
嗨,如果这对您有帮助,您能选择它作为答案吗?谢谢:)
0赞 Erez Ben Harush 12/4/2019 #2

您正在阅读带有“planetFileInput.nextLine()”的行两次,并且没有对第二次结果执行任何操作。 删除第二个匹配项。

通常,每个 hasNext() 调用都有一个 nextLine() 调用。

评论

0赞 RealSkeptic 12/4/2019
这并不完全正确。在第三个双精度之后有一个换行符,并且消耗了它。如果 OP 删除了它,那么下一个将使用这个空字符串,而不是下一个行星名称。最后一行可能没有任何内容 - 甚至没有换行符 - 在最后一个双精度之后。nextLine()nextLine()
0赞 TorusWithSprinkles 12/4/2019
感谢您的回复!你能解释一下你说的两遍是什么意思吗?在所有双精度之后都有“planetFileInput.nextLine()”,但是您提到的第二次出现在哪里?对不起,就像我说的,我非常喜欢 java。此外,当我删除 nextLine() 调用时,它只读取前 4 个条目并发生不匹配错误。