public class Test2 {
public static void main(String args[]) {
System.out.println(method());
}
public static int method() {
try {
throw new Exception();
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
}
在这个问题中try块有return语句并抛出异常也... 它的输出是COMPILER ERROR ....
我们知道finally块会覆盖try / catch块中的return或exception语句... 但这个问题在try块中都有... 为什么输出是错误的?
答案 0 :(得分:14)
由于您的return
语句无法访问 - 执行流程永远无法到达该行。
如果throw
语句位于if
- 子句中,则return
可能会被访问,错误就会消失。但在这种情况下,return
在那里没有意义。
另一个重要注意事项 - 避免从finally
子句返回。例如,Eclipse编译器在finally
子句中显示有关return语句的警告。
答案 1 :(得分:6)
编译器异常来自,就像我的Eclipse老兄说的那样
Unreachable code Test2.java line 11 Java Problem
永远不会达到主代码块的return语句,因为之前会抛出异常。
Alos注意到你的finally块的return语句至少是一个设计缺陷,就像Eclipse再次说的那样
finally block does not complete normally Test2.javajava line 14 Java Problem
实际上,由于finally块只是在这里提供一些干净的关闭,因此不会返回会覆盖通常由方法返回的结果的东西。
答案 2 :(得分:2)
throw new Exception()
无论如何都会被调用,因此try
之后的throw
块中的任何内容都是无法访问的代码。因此错误。
答案 3 :(得分:2)
public class Test2 {
public static void main(String args[]) {
System.out.println(method());
}
public static int method() {
try {
throw new Exception();
return 1; //<<< This is unreachable
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
}
它应该最终返回3.
答案 4 :(得分:0)
因为try块中的'return'关键字无法访问,所以这就是你得到编译时错误的原因。从try块中省略'return'关键字,然后运行你的程序,你将成功编译。