断言可以用于维护循环不变量和检查程序正确性吗

Could Assertions be used for maintaning loop invariants and checking program correctness

最近看到this个问题,觉得提问的人在某种程度上是正确的。答案告诉我们不应该使用断言来执行我们程序中的任何任务。

但是断言可以作为维护循环不变量和程序不变量的简单代码,因此我们可以在一定程度上检查程序的正确性。

为什么即使我们有 if else 也需要断言??它只是测试一个布尔表达式,类似的事情可以通过 if -else 梯形图来完成,那么为什么还要创建一个新的关键字断言呢?

A 'task in your program',在上下文中,意味着应该做的事情,并且理想地测试。

不仅是:

assert p != null

更短更简单
if (p == null) throw new IllegalArgumentException("p is null");

使它成为一个断言清楚地表明它是一个内部约束,而不是一个指定的行为。所以你不需要另外 4 行来测试它。

当然,有时明确指定的行为您想要的,例如public长寿命的API。

换句话说,虽然它们很相似,但在 if/throw 正确的地方使用断言是有点错误的,反之亦然。

尽管如此,很多 Java 代码并不关心断言,因为这样就少了一个决定。如果它不存在,我不确定它是否会被添加到语言中...