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

时间:2019-05-29 12:25:31

标签: java

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

public Object someMethod() {
   ....
   if(success){
     return result;
   } else {
      callMethodThatAlwaysThrowsUncheckedExceptions();
   }
}

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

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

  • 替换方法调用及其内容
  • 在方法调用之后添加返回语句,该语句返回一个空对象

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

还有其他解决方法吗?

5 个答案:

答案 0 :(得分:9)

只需围绕条款交换一下,如果方法抛出,您将永远不会返回。

 if(!success){
   callMethodThatAlwaysThrowsUncheckedExceptions();
 } 

 return result;

甚至

 callMethodThatAlwaysThrowsUncheckedExceptions(succes);
 return result;

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

答案 1 :(得分:4)

要表明您不希望到达一条直线(调用throwing方法之后),可以

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

答案 2 :(得分:3)

在Slawomir Chodnicki已经提供的出色answer之后,这是另一个建议。

更改您的callMethodThatAlwaysThrowsUncheckedExceptions(),将Exception扔到工厂方法中。例如:更改此值:

// somewhere in callMethodThatAlwaysThrowsUncheckedExceptions
throw new MyException();

收件人:

return new MyException();

这样,您可以像这样调用该方法:

throw callMethodThatAlwaysThrowsUncheckedExceptions();

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

这也适用于不同的例外,只是return而不是throw

答案 3 :(得分:2)

我喜欢减号的答案,但是对于可能错误地认为return result;将始终被执行(无论success的值如何)的用户而言,可能有点难以理解。

您也可以更改

void callMethodThatAlwaysThrowsUncheckedExceptions () {}

Object callMethodThatAlwaysThrowsUncheckedExceptions () {}

(无需更改方法主体)。

现在您可以写

public Object someMethod() {
    ....
    if (success) {
        return result;
    } else {
        return callMethodThatAlwaysThrowsUncheckedExceptions();
    }
}

答案 4 :(得分:1)

以上答案都不符合我的编程品味。我找到的最接近的匹配项是 here。受此链接答案的启发,我通过以下方式处理了此类 missing return statement 错误:

首先使方法的返回类型与它总是抛出的异常相同

MyCustomRuntimeException callMethodThatAlwaysThrowsUncheckedExceptions() {
    // ....
    throw new MyCustomRuntimeException();
}

接下来每当我们不得不使方法执行失败时,只需调用上面的方法并抛出它

public Object someMethod() {
   // ....
   if (success) {
     return result;
   } else {
      throw callMethodThatAlwaysThrowsUncheckedExceptions();
   }
}

即使在没有明确提及 void 关键字的情况下,也可以在具有 throw 返回类型的方法中使用。当然,在这些地方,一些 IDE 可能会警告 UnusedReturnValue,但这也可以被抑制。