java 即使try块可以读取文件,该方法仍然返回null,我如何让它返回预期的字符串?

l0oc07j2  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(161)

因此,测试运行以查看该方法是否可以读取文件并返回其内容。我已经尝试了不同的更改,这是我到目前为止所做的。我能够在while循环中打印出所有必要的内容,但一旦离开该循环,fileContents返回“null”。

public static String readTestResults(String fileName) {

        BufferedReader reader;
        String fileContents = " ";

        try {
            reader = new BufferedReader(new FileReader(fileName));
            fileContents = reader.readLine();

            while (fileContents != null) {
                System.out.println(fileContents);
                fileContents = reader.readLine();
            }
            reader.close();
            System.out.println("test: " + fileContents);
            return fileContents;
        }

        catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Print if code reaches here");
        return fileContents;

我添加了多个print语句,试图找出代码中可能存在bug的地方。它永远不会到达final语句。到目前为止,我的结果是:

Alex,Smith,99,A
Jolene,Schmidt,100,A
Mackinzie,Jensen,86,B
test: null

我需要它只返回那个名字列表,但只返回null。
我相信这可能是我的格式错误,但现在我被难住了。任何帮助将不胜感激!

tkclm6bt

tkclm6bt1#

首先看一下JavaDocs for BufferedReader#readline,它清楚地声明 “或null,如果到达流的末尾而没有阅读任何字符”
然后看看你的循环退出条件while (fileContents != null) {,这意味着在循环退出后fileContents将是null,这就是为什么当你执行return fileContents;时,你会返回null
如果你只想返回一个String来表示文件的全部内容,你可以这样做。

public static String readTestResults(String fileName) {
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        StringJoiner joiner = new StringJoiner(System.lineSeparator());
        String line = null;
        while ((line = reader.readLine()) != null) {
            joiner.add(line);
        }
        return joiner.toString();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

现在,就我个人而言,我不会在这里使用异常,而是抛出它,例如...

public static String readTestResults(String fileName) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        StringJoiner joiner = new StringJoiner(System.lineSeparator());
        String line = null;
        while ((line = reader.readLine()) != null) {
            joiner.add(line);
        }
        return joiner.toString();
    }
}

然后,调用者负责处理错误,这比返回null或空String更有意义。
你可能会发现使用Files#readAllLines会更容易,它会返回一个List<String>--这将更容易解析IMHO。
您还需要查看The try-with-resources Statement,以了解该代码实际上是如何工作的,以及为什么要使用它。

相关问题