如果我有一些简单的代码:

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();
    }
}

08-28 11:34