读取 java 中的文件时出错

Error in reading a file in java

我一直在尝试练习 I/O 文件编程,但我仍处于基础阶段。使用 java 写入文件很简单,但读取文件开始让我头疼。这是我尝试的一个简单程序 运行(顺便说一句,我基于 Liang 的一本书中的程序)。

import java.util.Scanner;
import java.io.File;
public class Reading {
private static Scanner n;

public static void main(String[] args) throws Exception
{
    File files = new File("samples.txt");
    n = new Scanner(files);

    while(n.hasNext())
    {
        String firstName = n.next();
        String mi = n.next();
        String lastName = n.next();
        int score = n.nextInt();
        System.out.println(
        firstName + " " + mi + " " + lastName + " " + score);
    }

    n.close();
}

}

这是错误:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at OOPFinals.Reading.main(Reading.java:17)

如何让这个程序运行? 求助!

有时当您阅读文件时,您会 运行 进入各种字符。有的是字母,有的是数字,有的是整数。您需要检查它是字母、数字还是 整数 ,因为以下行假设您传递的是整数:

    int score = n.nextInt();

可以通过检查整数来解决:

    int score = 0;
    if(n.hasNextInt()) { score = n.nextInt(); }

当您阅读节目时,请务必考虑 Cathial 的回答。通过使用 hasNext(),您只检查是否有一个字符串,也称为标记。您应该检查是否有 n 字符串可用,其中 n 是循环中 .next() 函数的数量。

NoSuchElementExceptionScanner.next() 抛出,意味着在文件中找不到更多标记。

这里的问题是你的 while() 循环只保证至少有一个标记可以从文件中读取,但是在循环的每次迭代中你正在读取五个标记。

您的代码中发生了什么,您正在尝试从扫描仪中读取,尽管那里没有任何可读取的内容。 你应该做什么 - 你需要在每次调用 n.next() 或 n.nextInt() 之前检查 n.hasNext(),或者只阅读整行(这似乎正是你想要的):

while (n.hasNextLine()) {
       String line = n.nextLine();
       System.out.println(line);
}

鉴于提供了正确的输入文件“samples.txt”,您的代码可以正常工作。例如,给定以下输入:

Richard Phillips Feynman 100
Paul Adrien Dirac 90

一切正常,但是如果您使用以下命令:

Richard Feynman 100
Paul Adrien Dirac 90

然后您获得 NoSuchElementException。在最后一个示例中,我删除了您的程序期望的中间名。因此,我们可以得出结论,您希望读取文件中的信息,而没有任何信息可供读取。我推荐如下内容:

import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.File;
public class Reading {
private static Scanner n;

public static void main(String[] args) throws Exception
{
    File files = new File("samples.txt");
    n = new Scanner(files);
    String data;
    while(n.hasNextLine() && !(data = n.nextLine()).equals(""))
    {
        StringTokenizer st = new StringTokenizer(data);

        if(st.countTokens() >= 4) {
            String firstName = (String) st.nextElement();        
            String mi = (String) st.nextElement();
            String lastName = (String) st.nextElement();
            int score = Integer.parseInt( (String) st.nextElement());
            System.out.println(
            firstName + " " + mi + " " + lastName + " " + score);

        } else {
            System.err.println("This line is malformed!");
        }
    }

    n.close();
}

}

在此程序中,您可以有一个包含空行的示例文件,它希望每行读取 4 个标记,否则它会打印一条错误消息,通知您某行输入格式错误。