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

Even though the try block can read the file, the method still returns null. How do I get it to return the expected string?

提问人:burneracc86 提问时间:4/18/2023 更新时间:4/18/2023 访问量:34

问:

因此,测试运行以查看该方法是否可以读取文件并返回其内容。我尝试了不同的改动,这就是我到目前为止所达到的。我能够在 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;

我添加了多个打印语句,以尝试查明代码可能被窃听的地方。它永远不会到达最终。到目前为止,我的结果是:

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

我需要它只返回该名称列表,但只返回 null。

我相信这可能是我的格式错误,但现在我被难住了。任何帮助将不胜感激!

java 文件-io io try-catch

评论

1赞 MadProgrammer 4/18/2023
首先看一下 BufferedReader#readline 的 JavaDocs,它清楚地指出“如果在没有读取任何字符的情况下到达了流的末尾,则为 null”。然后看看你的循环退出条件,这意味着这将是在循环退出之后,这就是为什么当你这样做时你会返回while (fileContents != null) {fileContentsnullreturn fileContents;null
0赞 MadProgrammer 4/18/2023
问题是,你是要返回所有内容的 a,还是要解析文件的每一行并返回 a of 值StringList
0赞 MadProgrammer 4/18/2023
如果你只想读取文件的内容,你可以使用 Files#readAllLines,它将返回一个List<String>
0赞 burneracc86 4/18/2023
@MadProgrammer我想返回所有内容的字符串。
0赞 burneracc86 4/18/2023
@MadProgrammer啊,我明白了。while 循环用于读取文件中的下一行。我尝试将该参数更改为 reader.readLine() != null,但随后它只返回文件中的第二行。

答:

0赞 MadProgrammer 4/18/2023 #1

首先看一下 BufferedReader#readline 的 JavaDocs,它清楚地指出“如果在没有读取任何字符的情况下到达了流的末尾,则为 null”。

然后查看您的循环退出条件,这意味着这将在循环退出之后,这就是为什么当您这样做时,您会返回while (fileContents != null) {fileContentsnullreturn 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();
    }
}

然后,调用方有责任处理错误,这比返回 or empty 更有意义。nullString

您可能还会发现使用 Files#readAllLines 更容易,它将返回一个 - 恕我直言,这将更容易解析。List<String>

您还需要查看 try-with-resources 语句,以了解该代码的实际工作方式以及为什么要使用它。

评论

0赞 burneracc86 4/18/2023
查看 your while 条件并让它在最后返回 null 让我尝试类似于我的代码的东西,它起作用了!谢谢!
0赞 MadProgrammer 4/18/2023
“问题”是,Java 中的串联成本很高,所以一般来说,建议使用 和 。我设置它的方式将允许您用于解析每一行StringStringBuilderStringJoinerScanner#nextLine
0赞 burneracc86 4/18/2023
是的!我最终不得不使用 StringBuffer,而且效果很好!再次感谢!