【问题标题】:unreachable statement after finally blockfinally 块后无法访问的语句
【发布时间】: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 块没有捕获异常。它运行了,然后异常仍然没有被捕获,所以方法退出了。

标签: java exception


【解决方案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 不会捕获异常!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-21
          • 2013-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-17
          • 2020-06-01
          相关资源
          最近更新 更多