Java assert 关键字有什么作用,何时应使用它?
在现实生活中,有哪些例子可以理解断言的关键作用?
断言(通过断言关键字)在Java 1.4中添加。它们用于验证代码中不变量的正确性。它们永远不应该在生产代码中触发,并且表示代码路径存在错误或误用。它们可以在运行时通过命令上的选项激活,但默认情况下不会打开。-ea
java
例如:
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;
}
假设你应该写一个程序来控制核电站。很明显,即使是最轻微的错误也可能产生灾难性的结果,因此您的代码必须没有错误(假设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异常是一个类似的概念,但它们无法验证所有内容。如果你想要更多的检查(以牺牲执行速度为代价),你需要使用断言。这样做会使你的代码膨胀,但你最终可以在一个令人惊讶的短开发时间内交付产品(你越早修复一个错误,成本就越低)。此外:如果您的代码中存在任何错误,您将检测到它。没有办法让错误溜走并在以后导致问题。
这仍然不能保证没有错误的代码,但它比通常的程序更接近这一点。