如何避免编译错误:缺少返回语句

epa*_*van 3 java

我有一个方法可以处理不同的错误代码,并始终引发未经检查的异常。该方法在全班许多地方都使用过。当我尝试在另一个没有void返回类型的方法中调用它时,如下所示:

public Object someMethod() {
   ....
   if(success){
     return result;
   } else {
      callMethodThatAlwaysThrowsUncheckedExceptions();
   }
}
Run Code Online (Sandbox Code Playgroud)

java编译器说该方法是missing return statement

我想到只有两个选择来解决这个问题:

  • 用其内容替换方法调用
  • 在返回空对象的方法调用之后添加return语句

但是,我真的不喜欢这些选项中的任何一个:第一个选项是因为代码重复,第二个选项是因为需要编写永远不会执行的代码。

还有其他解决方法吗?

Lin*_*ica 9

除了 Slawomir Chodnicki 已经提供的出色答案之外,还有另一个建议。

更改您的callMethodThatAlwaysThrowsUncheckedExceptions()某个地方将其放入Exception工厂方法中。例如:改变这个:

// somewhere in callMethodThatAlwaysThrowsUncheckedExceptions
throw new MyException();
Run Code Online (Sandbox Code Playgroud)

到:

return new MyException();
Run Code Online (Sandbox Code Playgroud)

这样你就可以像这样调用该方法:

throw callMethodThatAlwaysThrowsUncheckedExceptions();
Run Code Online (Sandbox Code Playgroud)

因此将帮助编译器看到这是该执行分支的最后一条语句。

这对于不同的异常也非常有效,只是return代替throw


min*_*nus 9

只是交换条件,如果方法抛出,您将永远无法返回。

 if(!success){
   callMethodThatAlwaysThrowsUncheckedExceptions();
 } 

 return result;
Run Code Online (Sandbox Code Playgroud)

甚至

 callMethodThatAlwaysThrowsUncheckedExceptions(succes);
 return result;
Run Code Online (Sandbox Code Playgroud)

只需检查您的投掷方法的成功条件即可。


Sla*_*cki 5

为了表明您不希望线路可达(在调用抛出方法之后),您可以

throw new AssertionError("comment to your co-developers why this never gets reached")