【问题标题】:Is is dangerous to have a return statement in the finally clause in java? [duplicate]在java的finally子句中有return语句是危险的吗? [复制]
【发布时间】:2016-04-24 06:07:25
【问题描述】:

看看下面的代码。尽管 catch 子句本身会引发异常,但 finally 块的 return 语句会导致该异常被吞没。即使在 catch 块中出现问题,此方法也会返回 420。

private static int foo() throws Exception
{
    try {
        throw new Exception("try");

    } catch (Exception ex) {
        throw new Exception("catch");
    } finally {
        String s = "";
        return 420;
    }


}

【问题讨论】:

  • 你已经描述了它的作用,你还有什么问题?危险吗? Exceptions 危险吗?
  • 在此上下文中定义“危险”。您显示的内容是合法的,如果将 return 语句放在 try/catch/finally 之后,则结果相同。这样做没有坏处,那么你问它是否“危险”是什么意思?
  • 有什么意义?如果您抛出异常,则调用将无法中断它。
  • 我的观点与观点相同,即这个问题被标记为重复关闭。但我想如果他们认为这个问题很愚蠢,这里有太多人太急于羞辱一个人。尽管很多时候问题不是愚蠢的。根据重复问题中的答案,是的,在 finally 子句中添加 return 是一种不好的做法。

标签: java exception-handling


【解决方案1】:

最终返回是一个非常糟糕的主意。它不仅隐藏您自己抛出的异常,还隐藏虚拟机错误,例如堆栈溢出或内存不足错误。这些错误可以在任何时候抛出,包括当数据结构的关键不变量不成立时,并且无法预测程序会做什么。

【讨论】:

    【解决方案2】:

    如果遇到异常,您应该返回其他内容。只有在最终返回语句中使用了引发该异常的变量时,该异常才是危险的。考虑一下:

    int a;
    try{
     //...
    }catch(Exception e){
     //a throws an exception somehow
    }finally{
     returns a;
    }
    

    当你像这样在另一边使用a 时:

    a += 1;
    

    你得到一个危险的异常

    我的建议是这样做:

    try{
     //...
    }catch(Exception e){
     //a throws an exception somehow
     returns -1;
    }finally{
     returns a;
    }
    

    另一方面:

    if(return_value == -1) // skip or do something else;
    

    这样,您就不会在另一边遇到意外的异常。

    【讨论】:

    • @GeorgeMulligan 怎么样?
    【解决方案3】:

    在你的情况下它是安全的,但是如果我们稍微改变你的情况

    private static FileReader foo() throws Exception{
        try {
            throw new Exception("try");
        } catch (Exception ex) {
            throw new Exception("catch");
        } finally {
            return new FileReader("");//this may also throw something
        }
    }
    

    现在,因为我们没有在您的文件系统中指定正确的路径 return new FileReader(""); 将抛出 FileNotFoundException 并且 我们将丢失在 catch 部分中抛出的异常 987654324@ 有潜在危险。

    【讨论】:

      猜你喜欢
      • 2021-02-04
      • 2013-06-04
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多