gpt4 book ai didi

java - 对嵌套的 try/catch block 有偏好吗?

转载 作者:IT老高 更新时间:2023-10-28 20:47:07 25 4
gpt4 key购买 nike

在 Java 中使用 Readers 和 Streams 时一直困扰我的一件事是 close() 方法可能会引发异常。由于将 close 方法放在 finally block 中是个好主意,因此需要一些尴尬的情况。我通常使用这种结构:

FileReader fr = new FileReader("SomeFile.txt");
try {
try {
fr.read();
} finally {
fr.close();
}
} catch(Exception e) {
// Do exception handling
}

但我也见过这种结构:

FileReader fr = new FileReader("SomeFile.txt");
try {
fr.read()
} catch (Exception e) {
// Do exception handling
} finally {
try {
fr.close();
} catch (Exception e) {
// Do exception handling
}
}

我更喜欢第一种构造,因为只有一个 catch block ,而且它看起来更优雅。是否有理由更喜欢第二种或另一种结构?

更新:如果我指出 readclose 都只抛出 IOExceptions,会有所不同吗?所以在我看来,如果读取失败,关闭也会因为同样的原因而失败。

最佳答案

恐怕第一个例子有一个大问题,就是如果在读取时或读取后发生异常,finally block 就会执行。到目前为止,一切都很好。但是如果 fr.close() 然后导致另一个异常被抛出呢?这将“胜过”第一个异常(有点像将 return 放在 finally block 中)并且您将丢失有关实际导致问题的所有信息 开始。

你的 finally block 应该使用:

IOUtil.closeSilently(fr);

这个实用方法的作用:

public static void closeSilently(Closeable c) {
try { c.close(); } catch (Exception e) {}
}

关于java - 对嵌套的 try/catch block 有偏好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/183499/

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