因此测试运行以查看该方法是否可以读取文件并返回其内容。我尝试了不同的改动,这就是我到目前为止所做的。我能够在 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
我需要它只返回那个名称列表,但只返回空值。
我相信这可能是我的格式错误,但现在我很困惑。任何帮助将不胜感激!
首先查看 BufferedReader#readline 的JavaDocs,它清楚地说明“如果在没有读取任何字符的情况下到达流的末尾,则为 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>
- 这将更容易解析恕我直言。
您还想看看 尝试使用资源声明 以了解该代码的实际工作方式以及您应该使用它的原因。