提问人:burneracc86 提问时间:4/18/2023 更新时间:4/18/2023 访问量:34
即使 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?
问:
因此,测试运行以查看该方法是否可以读取文件并返回其内容。我尝试了不同的改动,这就是我到目前为止所达到的。我能够在 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。
我相信这可能是我的格式错误,但现在我被难住了。任何帮助将不胜感激!
答:
0赞
MadProgrammer
4/18/2023
#1
首先看一下 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();
}
}
然后,调用方有责任处理错误,这比返回 or empty 更有意义。null
String
您可能还会发现使用 Files#readAllLines
更容易,它将返回一个 - 恕我直言,这将更容易解析。List<String>
您还需要查看 try-with-resources 语句,以了解该代码的实际工作方式以及为什么要使用它。
评论
0赞
burneracc86
4/18/2023
查看 your while 条件并让它在最后返回 null 让我尝试类似于我的代码的东西,它起作用了!谢谢!
0赞
MadProgrammer
4/18/2023
“问题”是,Java 中的串联成本很高,所以一般来说,建议使用 和 。我设置它的方式将允许您用于解析每一行String
StringBuilder
StringJoiner
Scanner#nextLine
0赞
burneracc86
4/18/2023
是的!我最终不得不使用 StringBuffer,而且效果很好!再次感谢!
评论
BufferedReader#readline
的 JavaDocs,它清楚地指出“如果在没有读取任何字符的情况下到达了流的末尾,则为 null”。然后看看你的循环退出条件,这意味着这将是在循环退出之后,这就是为什么当你这样做时你会返回while (fileContents != null) {
fileContents
null
return fileContents;
null
String
List
Files#readAllLines
,它将返回一个List<String>