我不明白为什么这个方法正确编译。
public int doIt() throws Exception{
//code that does not include a return int statement
throw new Exception("something");
}
我们声明了一个int的返回类型,为什么我没有收到类似的警告:“此方法必须返回int类型的结果?”
答案 0 :(得分:6)
方法的每个控制流都需要在 中返回相应类型的返回,或者在抛出的异常中终止。请参阅语言规范:
8.4.7. Method Body
如果声明某个方法具有返回类型,则每次返回 声明(第14.17节)在其正文中必须有一个表达式,或一个 发生编译时错误。
如果声明一个方法具有返回类型,那么编译时 如果方法的主体可以正常完成(第14.1节),则会发生错误。
换句话说,具有返回类型的方法必须仅使用提供值返回的return语句返回;它不是 被允许 “放下身体的末端”。
请注意,方法可能具有声明的返回类型,但不包含return语句。这是一个例子:
class DizzyDean { int pitch() { throw new RuntimeException("90 mph?!"); } }
抛出异常的方法永远不会返回,编译器的静态代码分析可以确定这一点。也就是说,编译器可以检查程序控制流,并确定通过方法体的每个执行路径返回适当类型的值,或者抛出异常。重要的是要注意,这仅基于程序结构,而不是基于价值分析。例如,编译器会抱怨类似的情况:
int returns42() {
if ( 2 > 1 ) {
return 42;
}
}
即使2 > 1
始终为真,编译器查看结构
int fnName() {
if ( condition ) {
return …;
}
}
基本上是说“如果condition
为假,会发生什么?那么这不会返回值!” (这是一个人为的案例,有些编译器可能能够处理2 > 1
的常量情况,但我不知道Java编译器有什么限制。)
答案 1 :(得分:1)
因为你的方法永远不会返回。
编译器能够告诉您始终通过非本地传输退出(即您在100%的时间内抛出异常),因此无需警告您返回值,因为没有代码会收到它
反过来看:
如果来电者有:
int x = o.doIt ();
...没有x
可以接收非整数的情况。 (也没有x
可以接收整数的情况)
答案 2 :(得分:1)
定义:异常是在程序执行期间发生的事件,它会破坏程序指令的正常流程。 所以
此声明throw new Exception("something");
正在终止执行,这就是你没有收到警告的原因。