代码中显然有一个无法访问的语句但编译 - 为什么?
The code clearly has an unreachable statement in it yet compiles - why?
第 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 行会导致 'unreachable statement' 编译时错误。
我想知道为什么编译器如此不一致...
编译器不会分析任何方法调用(例如throwE()
)来确定它是否总是会抛出异常,因为那是不切实际的。可能有 10(或 100)个方法调用链,其中最后一个方法总是抛出异常。在这种情况下,您是否仍然希望编译器确定 throwE()
之后的任何语句都是不可访问的?
只有当前方法总是直接抛出异常,throw语句后面的任何语句都被认为是不可达的。
第 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 行会导致 'unreachable statement' 编译时错误。
我想知道为什么编译器如此不一致...
编译器不会分析任何方法调用(例如throwE()
)来确定它是否总是会抛出异常,因为那是不切实际的。可能有 10(或 100)个方法调用链,其中最后一个方法总是抛出异常。在这种情况下,您是否仍然希望编译器确定 throwE()
之后的任何语句都是不可访问的?
只有当前方法总是直接抛出异常,throw语句后面的任何语句都被认为是不可达的。