finally 块后无法访问的语句

Posted

技术标签:

【中文标题】finally 块后无法访问的语句【英文标题】:unreachable statement after finally block 【发布时间】:2019-02-18 05:00:27 【问题描述】:

我正在学习 Java 中的异常,并且在此示例中遇到了编译错误:

public class FinallyExceptionExample 
    public static void main (String[] args) throws Exception 
        try 
            System.out.println("1");
            throw new Exception();
         finally
            System.out.println("3");
        
        System.out.println("4");
    

例外是行的“无法访问的语句”:

System.out.println("4");

我想知道为什么我会收到这个错误,通常在最后我们继续执行代码之后?

【问题讨论】:

不,为什么在发生未捕获的异常后代码会正常继续执行? 你的方法抛出了一个异常并且没有捕捉到它,所以try/finally块之后的任何东西都无法到达。 @khelwood 但最终块已执行。 是的,但是 finally 块没有捕获异常。它运行了,然后异常仍然没有被捕获,所以方法退出了。 【参考方案1】:

你没有发现你的异常。所以打印 1,执行 finally 块,然后抛出异常。 4永远不会被调用

【讨论】:

【参考方案2】:

finally 语句不会捕获try 块中抛出的异常。只有catch 语句可以捕获异常。

因此,永远不会到达System.out.println("4");,因为 try 块总是抛出未捕获的异常。

【讨论】:

【参考方案3】:

你抛出一个异常而不捕获它。这将导致代码执行提前终止,并且永远不会到达最后一行。

【讨论】:

【参考方案4】:

来自Oracle documentation

finally 块总是在 try 块退出时执行。这可以确保即使发生意外异常也会执行 finally 块。但是 finally 不仅仅对异常处理有用——它允许程序员避免清理代码被 return、continue 或 break 意外绕过。将清理代码放在 finally 块中始终是一种很好的做法,即使没有预料到异常也是如此。

记住:finally 不会捕获异常!

【讨论】:

以上是关于finally 块后无法访问的语句的主要内容,如果未能解决你的问题,请参考以下文章

无法访问的代码 - 尝试捕获 - 最终

为啥 Java 编译器不会为无法访问的 then 语句生成无法访问的语句错误?

Java复习-final

为啥我在 Java 中出现无法访问的语句错误?

它显示无法访问的语句错误

无法访问的语句[重复]