代码中显然有一个无法访问的语句,但可以编译 - 为啥? [复制]
Posted
技术标签:
【中文标题】代码中显然有一个无法访问的语句,但可以编译 - 为啥? [复制]【英文标题】:The code clearly has an unreachable statement in it yet compiles - why? [duplicate]代码中显然有一个无法访问的语句,但可以编译 - 为什么? [复制] 【发布时间】:2016-11-24 12:52:17 【问题描述】:第 2 行的语句永远不会执行,但编译器不会报错:
class Test
public static void main(String[] args) throws Exception
throwE();
// throw new Exception(); // Line 1
doStuff(); // Line 2
static void throwE() throws Exception
System.out.println("Throwing an Exception");
throw new Exception();
// doStuff(); // Line 3
static void doStuff() System.out.println("Doing stuff");
另一方面,取消注释第 1 行或第 3 行会导致“无法访问语句”编译时错误。
不知道为什么编译器这么不一致...
【问题讨论】:
在第一种情况下,编译器只知道有一个方法会抛出Exception
,但不能保证这个方法能做到。第二种情况,无论如何都会抛出异常。
另外,How can I detect dead code after always-throwing methods?
@Andrew Tobilko 非常有道理。谢谢你:)
【参考方案1】:
编译器不会分析任何方法调用(例如throwE()
)来确定它是否总是会抛出异常,因为这不切实际。可能有 10 个(或 100 个)方法调用链,其中最后一个方法总是抛出异常。在这种情况下,您是否仍希望编译器确定 throwE()
之后的任何语句都无法访问?
只有当当前方法总是直接抛出异常时,throw 语句后面的任何语句都被认为是不可达的。
【讨论】:
以上是关于代码中显然有一个无法访问的语句,但可以编译 - 为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章