【问题标题】:return statement - finally block does not complete normally [duplicate]return 语句 - finally 块未正常完成 [重复]
【发布时间】:2014-05-11 23:08:57
【问题描述】:

here 提出了类似的问题。但这并不能提供答案。

try {
        object = (Dev)Class.forName("Dev").newInstance();
    } catch (Exception e) 
    {
        throw new RuntimeException("Devis not available");
    }
    finally
    {
        return object;  
    }

finally 块给出警告:

finally 块没有正常完成

但据我了解,finally 块总是会被执行并返回对象。为什么警告说它不会正常完成?

【问题讨论】:

标签: java eclipse try-catch-finally


【解决方案1】:

从 finally 返回在 java 中是一种不好的做法。 它可能会导致许多意外的输出。检查以下链接以获取一些此类示例: http://www.cs.arizona.edu/projects/sumatra/hallofshame/

无论如何,发现与该 finally 块相关的链接很少,请按照以下链接获取与此相关的答案。 Does finally always execute in Java? Returning from a finally block in Java

【讨论】:

    【解决方案2】:

    在 try-catch-finally 语句中有很多关于 finally 块的解释。去寻找吧。

    无论如何快速解释:finally 块总是运行,无论是否抛出异常(并且可能被捕获)。如果 finally 块以 非正常 方式终止(例如自身抛出异常或返回值),这将始终覆盖在 try 块或 catch 块中所做的事情。这也意味着这些都丢失了。

    结论:永远不要抛出异常而不是从 finally 块返回值。仅用于清理进程。

    【讨论】:

      【解决方案3】:

      试试这个。如果您抛出异常,则对象有问题。赶上之前把它还回去。

      try {
          object = (Dev)Class.forName("Dev").newInstance();
               return object;
      } catch (Exception e) 
      {
          throw new RuntimeException("Devis not available");
      
      }
      

      【讨论】:

        【解决方案4】:

        问题是 finally 块会删除任何抛出的异常,因为它会发出“正常”返回。

        来自JLS spec

        finally 子句的突然完成可能会中断由 return 语句启动的控制转移。

        和(在你的情况下更相关):

        请注意,finally 子句的突然完成可能会中断由 throw 语句启动的控制转移。

        【讨论】:

        猜你喜欢
        • 2013-06-04
        • 2015-01-17
        • 1970-01-01
        • 2014-04-19
        • 2013-05-05
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多