【发布时间】:2018-03-11 21:39:06
【问题描述】:
根据 Java 语言规范 Java SE 8 版,§14.21 Unreachable Statements:
如果一条语句因为无法访问而无法执行,这是一个编译时错误。
该标准继续准确定义可达/不可达和可以正常完成的含义。
因此,不能将assert false; 或throw new RuntimeException("can't reach here"); 之类的语句放在代码中无法到达的位置,因为这会导致编译错误。
是否有一种标准或通用的做法来标记代码中的不可到达点而不会引入编译错误,例如带有一些特殊语法的注释(例如//unreachable)?希望还有 lint 工具可以自动验证这些标记是否确实对应于无法到达的点,类似于 this question 询问某个 C 代码库中的特殊 cmets。
我问的原因是因为我有一段代码,其中包含一个长链的 if/else if/else 块在 switch 案例中,每个(当前)都以 return 语句结尾。但是,我预计可能会添加另一个条件块,我会忘记以return 语句结尾,从而导致switch 语句中的意外失败。另一个潜在用途是确保某个条件代码块总是会从循环中中断。
【问题讨论】:
-
我认为您的问题应该改写为询问您是否可以通过案例陈述检测到跌倒。无法访问的代码无法编译
-
不确定我的问题是否正确,但是,是的,Java 编译器会为您标记这一点,您必须更正代码才能编译它。不过,我不认为 java 编译器 100% 向您显示代码中所有无法访问的语句,因为即使有一个无法访问的语句,您的代码也已经损坏。您可以在任何 IDE(例如 Eclipse)中看到这种无法访问的语句编译错误。
-
顺便说一句
fallthrough已经是 javac lint 选项 -
@cricket_007 我认为这不仅仅是一个潜在的用例。另一个用例是确保如果控制流到达循环中的某个块,那么块的末端是不可达的;即块内的所有分支都从循环中中断或从函数返回。另外,我知道
-Xlint:fallthrough,但我有意在其他地方使用fallthrough。作为部分解决方案,我想我可以启用此功能并抑制警告(通过@SuppressWarnings("fallthrough")),其中打算失败。 -
@SergeiSirik 我想知道是否有办法以不是编译错误的方式标记无法到达的点。
标签: java lint unreachable-code