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语句中,解析器可以访问语句,为什么语句没有执行。?
答案 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
块中的finally
,return
后面的代码
根本不会执行。
因此,return
块中的finally
将生成代码
在它无法到达之后。
TL; DR:在一种情况下,“TEST”语句无法访问,原因是 Java编译器旨在识别;在另一种情况下,由于Java编译器 设计为无法识别,因此无法访问“TEST”语句。