【问题标题】:Why in many codes written "if try catch"?为什么在许多代码中写成“if try catch”?
【发布时间】:2014-05-19 11:11:41
【问题描述】:

为什么很多代码写成这样:

finally{
if(out!=null){
try{out.close();}
catch(){}
}}

但不是:

finally{
try{out.close();}
catch(){}
}

【问题讨论】:

  • 因为如果out == null,你会得到一个NullPointerException
  • 你尝试这个时发生了什么?
  • 更不用说 catch(){} 不会发生。您需要指定您捕获的内容。另外:catch(xxException e){} 不应出现在“许多代码”中,因为隐藏问题并不能解决问题。
  • try...catch 在第一种情况下不需要,非空检查将完成这项工作。
  • @KishanSarsechaGajjar 在if 语句中处理显式空指针检查比作为异常处理更好。

标签: java syntax syntax-error


【解决方案1】:

通常您想要创建某种流。这种创建可能会失败,例如因为文件丢失或 Internet 连接不工作。因此,您需要将其放入 try-catch-block 中,因为它会引发您需要处理的检查异常:

Stream stream = null;
try {
    stream = makeNewStream();
    // more stuff
} catch(SomeException e) {
    // do something with the exception
}

现在您要确定,无论发生什么,流最终都会关闭。所以你添加了一个 finally 块:

Stream stream = null;
try {
    stream = makeNewStream();
    // more stuff
} catch(SomeException e) {

} finally {
    stream.close()
}

这个块在任何情况下都会被调用,即使你的代码失败了(例如stream = makeNewStream(); 抛出一个异常)。但如果stream = makeNewStream(); 抛出异常,变量stream 将为空。所以你需要检查流是否为空(你不能在 null 上调用方法):

finally {
    if(stream != null)
        stream.close()
}

现在,不幸的是,close() 也会抛出一个检查异常(需要处理),所以你也必须检查这个。你最终会得到这样的结果:

Stream stream = null;
try {
    stream = makeNewStream();
    // more stuff
} catch(SomeException e) {

} finally {
    if(stream != null) {
        try {
            stream.close()
        } catch(ClosingException e) {
            // ignore this
        }
    }
}

大多数开发人员只会忽略 finally 块中的最后一个异常。

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2010-11-12
    相关资源
    最近更新 更多