2011-05-06 150 views

回答

1

最重要的是要注意的是,使用断言和测试你的代码是两个不同的(如果可能相关的)任务。

我认为断言docs几乎可以解释使用断言的情况。

0

是的,使用assert来验证程序运行时的正确性是有用的。我通常会使用它来根据fail-fast principle来发现错误以主动检测错误。

典型的用例是操作成功。考虑下面的示例:

int nChanges = database.update(..); 
assert(nChanges == 1); 

我不会考虑使用它的参数验证或任何这样的操作应在正规的代码按合同进行验证,因为它不抛出适当的例外(和运行时间例外可以是平均值)。同样,我不会在测试中使用它,因为JUnit已经提供了断言机制,与常规断言语句不同,它不能被禁用。

1

断言在没有异常处理的语言中很受欢迎,用于进行检查以确保程序正常运行,从而使问题更易于诊断。

然而,如果一个断言触发了什么是最合适的行为原因,可能会有一些含糊不清。如果程序立即退出,可能会有更多的优雅处理失败的机会(例如向用户报告失败并尝试恢复数据)。如果程序没有立即退出,它可能会因为错误而处于未知状态,这也是不理想的。

因此,当给定的条件失败时,抛出Java中的异常被认为是更好的做法,这可以为这些问题提供最好的解决方案。对于在程序正常运行期间可能发生的错误,检查异常是最合适的。调用代码有义务处理这些错误。对于由内部程序逻辑故障引起的错误,抛出一个RuntimeException将允许程序在调用堆栈中进一步处理错误。

声明确实有一个好处,就是它们可以在开发中使用,但可以为消费者或发布版本“编译出来”,其执行速度比早期检测和处理错误更重要。然而,那些需要这种特性的应用程序通常不是用Java编写的(更可能是C++),这也是为什么断言在Java中很少见的原因。

(另外,我认为,在运行时的资产不会因有些IDE默认情况下始终启用无论如何,所以很容易有一个断言失败,不知道这件事。)

+1

我完全不同意。断言非常有用。他们在Java中比C++更不重要的原因很简单,因为Java是一种更安全的语言,所以大多数断言失败的机会(例如数组索引越界)已经为您检查。异常断言之间的关键区别在于:例外情况适用于您希望在生产中偶尔遇到的异常情况,您可以从中恢复。断言适用于你永远不会看到的情况,除非你的代码中存在一个错误。唯一的恢复方法是返回并修复你的代码。 – MiguelMunoz 2014-01-16 22:59:56

+1

因此,断言仅适用于开发阶段。这就是为什么你需要打开它们来使用它们。 。 (默认情况下它们是关闭的。)在生产中,您可以将它们关闭。使用assert的全部原因是为了发现潜在的错误。这就是为什么他们抛出错误而不是例外。它们不应该是您正常异常处理的一部分。另外,由于您将它们关闭以进行生产,因此您可以负担编写可以执行大量工作(并放慢速度)的断言,以确保代码按预期工作。你通常不需要这样做,但如果你需要的话,选项就在那里。 – MiguelMunoz 2014-01-16 23:00:12