gpt4 book ai didi

java - 关闭读写器的异常处理

转载 作者:行者123 更新时间:2023-11-29 07:48:16 29 4
gpt4 key购买 nike

我只是回顾了我们在正在学习的 Java 类中编写的一些代码。我注意到在 finally block 中有一个 try/catch 用于关闭读者,而不是作者。我将复制下面的代码。谁能解释为什么会这样?我想更好地理解。

public class UsingFiles {
public static void main(String[] args) {
// open the input stream (from the file of this program)
BufferedReader reader = null;
PrintWriter writer = null;
try {
reader = new BufferedReader(new FileReader("./src/UsingFiles.java"));
writer = new PrintWriter("reverseFile.txt");
// String line;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
// print the file in reverse order
// use recursion
reverseFile(reader, writer);
} catch (FileNotFoundException e) {
System.out.println("Couldn't open the file!");
} catch (IOException e) {
System.out.println("Problem reading the file");
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
System.out.println("Couldn't close the reader");
}
}
if (writer != null) {
writer.close();
}
}
}

private static void reverseFile(BufferedReader reader, PrintWriter writer)
throws IOException {
String line = reader.readLine();
if (line != null) {
reverseFile(reader, writer);
writer.println(line);
}
}

最佳答案

我能想到的有两种可能:

  1. 这是一个疏忽
  2. close() 的两次调用都可能引发异常。如果第一个抛出异常,第二个将被跳过——当然除非第一个被包装在它自己的 try/catch block 中。第二个不需要 try/catch block ,因为如果失败,则不会跳过后续代码

在“现实世界”中,我会说答案是#1。我认为 #2 不太可能的原因是通常有一些其他代码是您想要执行的,即使您无法关闭某些流。如果 catch block 没有捕获到异常(或重新抛出不同的异常),这将尤其如此,因为 finally block 中的新异常将替换原始异常并且你永远不会知道它已经发生了。

更新

正如另一个答案所指出的,PrintWriter.close() 实际上并没有抛出 IOException,即使父接口(interface) Writer确实声明 close() 可以抛出 IOException。所以这可能是一个更好的解释。

关于java - 关闭读写器的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23507891/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com