【问题标题】:Is there a way to mark (e.g. annotate) a Java method as never returning?有没有办法将 Java 方法标记(例如注释)为永不返回?
【发布时间】:2012-06-28 17:07:23
【问题描述】:

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

这样的代码:

x = foo();
if (x == null)
    fail("x is null");
return x.bar();

我收到 x 可能为空的警告。但它不可能,因为失败总是抛出,因此永远不会返回。 (通过更好的程序间分析,它大概可以自动确定这一点,但目前似乎还没有。)

显然,有一些方法可以重写代码来绕过警告,但我想要的是一种指示失败永远不会返回的方法(例如注释)。

我也尝试使用 @SuppressWarnings("null") 来抑制警告,但没有奏效。

消除警告的一种方法是添加:assert x != null;(假设您已打开设置以在 null 分析中包含断言)

在 GCC C++ 中我可以做到:void fn __attribute__ ((noreturn))

【问题讨论】:

  • 我不知道这种情况。你有这个需求,还是更多的学术探究?
  • 这并不重要,因为我可以轻松解决它,但它来自实际的生产代码。

标签: java eclipse


【解决方案1】:

一种半传统的方法如下:

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

所以你可以写throw fail("x is null")。当然,fail 总是会抛出,而不是 throw,但这足以让编译器放心,该行总是会抛出。

【讨论】:

  • 有趣的解决方法。有人推荐使用这种模式吗?
  • 作为参考,它是 Guava 在Throwables 实用程序类中使用的模式。
  • 为什么这比public RuntimeException fail(String message) { return new RuntimeException(message); }好?我只是在问一个问题,而不是表达偏好。
  • 大多数情况下您可以以任何一种方式使用它;如果你不需要向编译器证明任何东西,那么你可以在没有throw 的情况下调用它。
  • 一开始我想知道,但后来我意识到如果你调用失败而不抛出,它是“更安全的”。特别是因为它曾经在我的代码中是这样工作的。
【解决方案2】:

【讨论】:

  • 这如何解决用户的问题?他已经在明确检查 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2020-04-29
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多