我有一个方法可以处理不同的错误代码,并始终引发未经检查的异常。该方法在全班许多地方都使用过。当我尝试在另一个没有void返回类型的方法中调用它时,如下所示:
public Object someMethod() {
....
if(success){
return result;
} else {
callMethodThatAlwaysThrowsUncheckedExceptions();
}
}
java编译器说该方法为missing return statement
。
我想到只有两个选择来解决这个问题:
但是我真的不喜欢这些选项中的任何一个:第一个因为代码重复而第二个因为需要编写永远不会执行的代码。
还有其他解决方法吗?
答案 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
,但这也可以被抑制。