如果我有一些简单的代码:
public int doSomething(final String str)
{
try
{
return Integer.parseInt(str);
}
catch (final NumberFormatException e)
{
throw new IllegalArgumentException("Bad");
}
}
一切都很好,但是如果我想创建异常并将其移到它自己的方法中:
public int doSomethingElse(final String str)
{
try
{
return Integer.parseInt(str);
}
catch (final NumberFormatException e)
{
doThrow();
}
}
public void doThrow()
{
throw new IllegalArgumentException("Bad");
}
则代码不再在IntelliJ中编译,因为它不了解
doThrow()
总是会抛出异常,因此抱怨该路径中没有返回值。在我看来,这是为IntelliJ合同设置的类型,但是如果我尝试将
@Contract("_ -> fail")
批注添加到doThrow()
,则无济于事。我该如何进行这项工作(在调用return null
之后添加一个doThrow()
,这很丑陋)。 最佳答案
Java编译器对诸如@Contract
之类的JetBrains属性一无所知。 IntelliJ可能知道doThrow()
总是抛出,但是编译器不会抛出,因此这不是格式正确的代码。
在这种情况下,我可以使用一种实用程序方法:
public final class ContractUtilities {
public static IllegalStateException unreachable() {
return new IllegalStateException("Code is supposed to be unreachable.");
}
// ...
}
...并且我添加了一个理论上无法访问的
throw
语句,如下所示:public int doSomethingElse(final String str) {
try {
return Integer.parseInt(str);
}
catch (final NumberFormatException e) {
doThrow();
throw ContractUtilities.unreachable();
}
}
您还可以简单地使
doThrow()
返回要抛出的异常:public int doSomethingElse(final String str) {
try {
return Integer.parseInt(str);
}
catch (final NumberFormatException e) {
throw doThrow();
}
}