方法不返回int

时间:2014-02-01 11:52:06

标签: java

我不明白为什么这个方法正确编译。

public int doIt() throws Exception{

      //code that does not include a return int statement

     throw new Exception("something");
   }

我们声明了一个int的返回类型,为什么我没有收到类似的警告:“此方法必须返回int类型的结果?”

3 个答案:

答案 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");

正在终止执行,这就是你没有收到警告的原因。

See this