Finally 块中 return 语句的不可访问语句

Unrechable Statement if return Statement in Finally Block

public class UnrechableCode {
        public static void main (String args[])
        {
            UnrechableCode uc=new UnrechableCode();
            try
            {
               System.out.println(1/0);
            }
            catch(Exception e)
            {
                System.out.print("Inside Catch");
                return ;
            }
            finally
            {
                 System.out.println("Inside Finally");
                 //return;
            }
            System.out.println("TEST");
        }
}

在上面的代码中,当从 Catch 中删除 return 语句时,finally 块之后的语句不会被执行,但它可以被解析器访问。 在相同的情况下,如果我在 finally 块中写 return 相同的语句无法被解析器访问,那么如果在前面的 case 语句中解析器可以访问为什么语句不执行。?

Java 编译器只有有限的能力来预测是否 程序中的特定代码行永远无法到达。 这个事实并不是 Java 的设计者的错;这是一个事实 不可能预测所有可能程序的行为 如此完全的通用语言。 Java 的设计者可以做出的唯一选择是如何限制 编译器的这个能力应该是。

Why does Java have an "unreachable statement" compiler error? 为了讨论为什么编译器有这种能力, 为什么它认为 "unreachable code" 是一个错误, 以及为什么有些东西可以(相对容易地)被检测为 "unreachable code" 不被认为是 "unreachable code" 错误 由编译器。

在你的特殊情况下,1/0 总是会抛出一个 异常,加上在 catch 块中有一个 return 捕获异常的事实,将阻止程序的任何执行 从曾经将 "TEST" 写入输出。 但是 Java 编译器不会尝试考虑抛出的异常 当它寻找无法访问的代码时,诸如 1/0 之类的东西。 因此,它的行为就好像有一个可能的控制路径被执行 try块,没有抛出异常(所以没有执行任何代码 在 catch 块中),然后执行 finally 块,然后是 finally 块之后的代码。

编译器的其中一件事 考虑的是 finally 块将 总是在它后面的代码之前执行,如果有 finally块中的returnreturn之后的代码 根本不会执行。 因此 finally 块中的 return 将使代码 在无法访问之后。

TL;DR: 在一种情况下,"TEST" 语句无法访问,原因如下 Java 编译器旨在识别;在另一种情况下,"TEST" 语句无法访问,原因是 Java 编译器 不是 旨在识别的原因。