return语句 - finally块没有正常完成

时间:2014-04-01 09:12:43

标签: java eclipse try-catch-finally

类似的问题已经被问到here。但这并没有提供答案。

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

但是终于阻止了警告:

  

finally块无法正常完成

但是根据我的不足,终于块总是被执行并返回对象。为什么警告说它不会正常完成?

4 个答案:

答案 0 :(得分:4)

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

来自JLS spec

  

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

和(在您的案例中更相关):

  

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

答案 1 :(得分:3)

在try-catch-finally语句中有关于finally块的解释有很多。去搜索它。

无论如何快速解释:始终运行finally块,无论是否抛出(并且可能被捕获)异常。如果finally块以 unnormal 方式终止(例如自己抛出一个excpetion或返回一个值),那么这将总是覆盖try块或catch块中的内容。这也意味着它们会丢失。

结论:永远不会抛出异常从finally块返回一个值。仅用于清理过程。

答案 2 :(得分:0)

试试这个。如果你抛出异常而不是对象有问题。只是在捕获之前返回它。

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

}

答案 3 :(得分:0)

从最后回来是java中的一个不好的做法。 它可能会导致许多意外的输出。请查看以下链接,了解一些此类示例: http://www.cs.arizona.edu/projects/sumatra/hallofshame/

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