0
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 语句中解析器可以访问为什么语句没有执行。?

4

1 回答 1

2

Java 编译器只有有限的能力来预测是否可以到达程序中的特定代码行。这个事实不是 Java 设计者的错。事实证明,不可能如此完全地预测通用语言的所有可能程序的行为。Java 的设计者可以做出的唯一选择是编译器的这种能力应该受到多大的限制。

请参阅为什么 Java 会出现“无法访问的语句”编译器错误? 讨论为什么编译器完全有这种能力,为什么它认为“无法访问的代码”是一个错误,以及为什么一些可能(相对容易)被检测为“无法访问的代码”的东西不被认为是“无法访问的代码”编译器的错误。

在您的特定情况下,1/0总是会抛出异常的事实,以及returncatch块中有一个捕获异常的事实,将阻止程序的任何执行将“TEST”写入输出。但是 Java 编译器不会尝试解释由诸如1/0查找无法访问的代码之类的事情引发的异常。因此,它就好像存在执行该try块的可能控制路径,没有引发异常(因此没有执行该catch块中的任何代码),然后执行该finally 块,然后执行该块之后的代码finally

编译器确实考虑的一件事 是该finally块将始终在其后面的代码之前执行,并且如果该块中有 a return,则该finally块之后的代码return 根本不会执行。因此returnfinally块中的 a 将使后面的代码无法访问。

TL;DR:在一种情况下,“TEST”语句由于 Java 编译器旨在识别的原因而无法访问;在另一种情况下,“TEST”语句由于 Java 编译器无法识别的原因而无法访问。

于 2016-07-15T14:11:15.513 回答