8

我有一个方法可以处理不同的错误代码并且总是抛出未经检查的异常。这种方法在整个班级的许多地方都使用过。当我尝试在另一个没有 void 返回类型的方法中调用它时,如下所示:

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

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

我只想到了两个选项来解决这个问题:

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

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

有没有其他方法可以解决这个问题?

4

5 回答 5

13

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

 if(!success){
   callMethodThatAlwaysThrowsUncheckedExceptions();
 } 

 return result;

甚至

 callMethodThatAlwaysThrowsUncheckedExceptions(succes);
 return result;

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

于 2019-05-29T12:33:35.513 回答
5

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

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

于 2019-05-29T12:27:51.633 回答
5

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

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

// somewhere in callMethodThatAlwaysThrowsUncheckedExceptions
throw new MyException();

至:

return new MyException();

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

throw callMethodThatAlwaysThrowsUncheckedExceptions();

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

这也适用于不同的例外情况,只是return代替throw

于 2019-05-29T12:32:06.603 回答
1

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

作为替代方案,您可以更改

void callMethodThatAlwaysThrowsUncheckedExceptions () {}

Object callMethodThatAlwaysThrowsUncheckedExceptions () {}

(无需更改方法体)。

现在你可以写

public Object someMethod() {
    ....
    if (success) {
        return result;
    } else {
        return callMethodThatAlwaysThrowsUncheckedExceptions();
    }
}
于 2019-05-29T12:40:12.573 回答
0

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

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

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

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

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

这甚至可以在void没有明确提及throw关键字的具有返回类型的方法中使用。当然,在这些地方,一些 IDE 可能会发出警告,UnusedReturnValue但也可以将其抑制。

于 2021-06-15T10:37:53.867 回答