Java assert 关键字有什么作用,应该在什么时候使用?

新手上路,请多包涵

有哪些 现实生活中的例子 可以帮助理解断言的关键作用?

原文由 Praveen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 405
2 个回答

Java 1.4 中添加了 断言(通过 assert 关键字)。它们用于验证代码中不变量的正确性。它们永远不应该在生产代码中触发,并且表示错误或代码路径的误用。它们可以在运行时通过 java 命令上的 -ea 选项激活,但默认情况下不打开。

一个例子:

 public Foo acquireFoo(int id) {
  Foo result = null;
  if (id > 50) {
    result = fooService.read(id);
  } else {
    result = new Foo(id);
  }
  assert result != null;

  return result;
}

原文由 Ophidian 发布,翻译遵循 CC BY-SA 3.0 许可协议

假设您要编写一个程序来控制核电站。很明显,即使是最微小的错误也可能导致灾难性的后果,因此您的代码 必须没有 错误(假设 JVM 是无错误的)。

Java 不是一种可验证的语言,这意味着:您无法计算出您的操作结果将是完美的。这样做的主要原因是指针:它们可以指向任何地方或任何地方,因此它们不能被计算为这个精确值,至少不能在合理的代码范围内。鉴于这个问题,没有办法证明你的代码在整体上是正确的。但是您可以做的是证明您至少在每个错误发生时都能找到它。

这个想法基于 合同设计(DbC) 范例:您首先定义(以数学精度)您的方法应该做什么,然后通过在实际执行期间对其进行测试来验证这一点。例子:

 // Calculates the sum of a (int) + b (int) and returns the result (int).
int sum(int a, int b) {
  return a + b;
}

虽然这很明显可以正常工作,但大多数程序员不会看到其中隐藏的错误(提示:Ariane V 因类似错误而崩溃)。现在 DbC 定义您必须 始终 检查函数的输入和输出以验证它是否正常工作。 Java 可以通过断言来做到这一点:

 // Calculates the sum of a (int) + b (int) and returns the result (int).
int sum(int a, int b) {
    assert (Integer.MAX_VALUE - a >= b) : "Value of " + a + " + " + b + " is too large to add.";
  final int result = a + b;
    assert (result - a == b) : "Sum of " + a + " + " + b + " returned wrong sum " + result;
  return result;
}

如果此功能现在失败,您会注意到它。你会知道你的代码中有问题,你知道它在哪里,你知道是什么导致了它(类似于异常)。更重要的是:当它发生时你停止执行以防止任何进一步的代码使用错误的值并可能对其控制的任何东西造成损害。

Java 异常是一个类似的概念,但它们无法验证所有内容。如果你想要更多的检查(以执行速度为代价),你需要使用断言。这样做会使您的代码膨胀,但您最终可以在极短的开发时间内交付产品(越早修复错误,成本越低)。此外:如果您的代码中有任何错误,您将检测到它。没有办法让错误溜走并在以后引起问题。

这仍然不能保证代码没有错误,但它比通常的程序更接近于此。

原文由 TwoThe 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题