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

问题描述 投票:0回答:1

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

我需要它只返回那个名称列表,但只返回空值。

我相信这可能是我的格式错误,但现在我很困惑。任何帮助将不胜感激!

java file-io io try-catch
1个回答
0
投票

首先查看 BufferedReader#readlineJavaDocs,它清楚地说明“如果在没有读取任何字符的情况下到达流的末尾,则为 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>
- 这将更容易解析恕我直言。

您还想看看 尝试使用资源声明 以了解该代码的实际工作方式以及您应该使用它的原因。

© www.soinside.com 2019 - 2024. All rights reserved.