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 块后无法访问的语句的主要内容,如果未能解决你的问题,请参考以下文章