如果在Finally块中返回Statement,则为Unchachable语句

时间:2016-07-15 11:40:59

标签: parsing return block finally unreachable-code

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块中写入返回,则解析器无法访问同一语句,因此如果在前面的case语句中,解析器可以访问语句,为什么语句没有执行。?

1 个答案:

答案 0 :(得分:2)

Java编译器只能预测是否有限 可以访问程序中的特定代码行。 这个事实不是Java设计者的错;事实证明这是事实 无法预测所有可能程序的行为 一般的通用语言。 Java的设计者唯一可以做的选择就是有限 编译器的这种能力应该是。

参见Why does Java have an "unreachable statement" compiler error? 讨论为什么编译器具有这种能力, 为什么它认为“无法访问的代码”是一个错误, 以及为什么有些事情(相对容易)被发现了 “无法访问的代码”不被视为“无法访问的代码”错误 由编译器。

在您的特定情况下,1/0将始终抛出一个事实 异常,以及return块中有catch捕获异常的事实,将阻止程序的任何执行 从写“TEST”到输出。 但Java编译器不会尝试考虑引发的异常 当1/0查找无法访问的代码时。 因此,它就好像存在可执行的控制路径 try块,抛出异常(因此没有执行任何代码 在catch块中),然后执行finally 阻止finally阻止后的代码。

编译器的一件事 认为是finally块会 总是在它后面的代码之前执行,如果有的话 return块中的finallyreturn后面的代码 根本不会执行。 因此,return块中的finally将生成代码 在它无法到达之后。

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