返回语句 - finally块未正常完成

3

类似的问题已经在这里提出。但是那并没有给出答案。

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

但是finally块会发出警告:

finally块未正常完成

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


1
由于您的对象定义在try块中,该块可能无法按预期完成。因此,... - Ritikesh
1
在这种情况下,finally将返回null。但它将被执行。 - codingenious
这个答案可能会有用:https://dev59.com/oGMl5IYBdhLWcg3wr4rn#18205628 - Baby
4个回答

5
问题在于 finally 块会发出“正常”返回,因此会删除任何被抛出的异常。
来自 JLS规范
finally 子句的突然完成可能会破坏由 return 语句启动的控制转移。
而且(在您的情况下更相关):
请注意,finally 子句的突然完成可能会破坏由 throw 语句启动的控制转移。


4

在try-catch-finally语句中,对于finally块有很多解释。去搜索一下吧。

简单解释一下:无论是否抛出异常(可能被捕获),finally块始终会执行。如果finally块以非正常的方式(例如抛出异常或返回值)终止,则这将始终覆盖try块或catch块中的操作, 这也意味着这些内容会丢失。

结论:永远不要从finally块中抛出异常或返回值。只用它来清理进程。


0

0

试试这个。如果你正在抛出异常,那么对象肯定有问题。在 catch 之前先返回它。

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接