有没有一种方法可以标记(例如注释)Java方法永远不会返回?

12

我刚开始使用新版的Eclipse 4.2 (Juno) Null Analysis。

在如下代码中:

x = foo();
if (x == null)
    fail("x is null");
return x.bar();
我收到了 x 可能为 null 的警告,但它不可能是 null,因为 fail 方法总是抛出异常并且从不返回(使用更好的过程间分析可能可以自动确定这一点,但目前似乎还没有这样的分析)。显然,有一些方法可以重写代码来避免警告,但我想要的是一种方式来指示(例如一个注解),表明 fail 从不返回。我还尝试使用 @SuppressWarnings("null") 来抑制警告,但这没有起作用。可以通过添加 assert x != null;(假设您已经打开了包括断言在 null 分析中的设置)来消除警告。在 GCC C++ 中,我可以这样做:void fn __attribute__ ((noreturn))

我不知道这种情况。你需要这个吗,还是更多的学术探究? - BlackVegetable
1
这并不是很关键,因为我可以轻松地解决它,但它来自实际的生产代码。 - Andrew McKinlay
2个回答

15

有一种半传统的方法是按以下步骤进行:

public RuntimeException fail(String message) {
  throw new RuntimeException(message);
}

你可以这样写:throw fail("x is null")。当然,fail函数将会抛出异常而不是throw关键字,但这足以让编译器确信该行代码一定会抛出异常。


1
有趣的解决方法。有人推荐使用这种模式吗? - BlackVegetable
6
作为参考,这是Guava在Throwables实用类中使用的模式。 - Louis Wasserman
为什么这比 public RuntimeException fail(String message) { return new RuntimeException(message); } 更好?我只是在问问题,没有表达偏好。 - emory
2
大多数情况下,您可以以任何一种方式使用它;如果您不需要向编译器证明任何内容,则可以在不使用“throw”的情况下直接调用它。 - Louis Wasserman
1
起初我也有疑问,但后来意识到这样做更“安全”,以防你在不抛出异常的情况下调用失败。特别是因为这是我的代码过去的工作方式。 - Andrew McKinlay
显示剩余2条评论

0

这样做如何解决用户的问题?他已经在明确检查 null。 - Louis Wasserman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接