Java assert 关键字有什么作用,何时应使用它?

2022-08-31 04:09:15

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


答案 1

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

例如:

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

答案 2

假设你应该写一个程序来控制核电站。很明显,即使是最轻微的错误也可能产生灾难性的结果,因此您的代码必须没有错误(假设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;
}

虽然这很明显可以正常工作,但大多数程序员不会看到这个里面隐藏的错误(提示:阿丽亚娜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异常是一个类似的概念,但它们无法验证所有内容。如果你想要更多的检查(以牺牲执行速度为代价),你需要使用断言。这样做会使你的代码膨胀,但你最终可以在一个令人惊讶的短开发时间内交付产品(你越早修复一个错误,成本就越低)。此外:如果您的代码中存在任何错误,您将检测到它。没有办法让错误溜走并在以后导致问题。

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


推荐