你使用断言吗?

时间:2009-07-30 18:23:24

标签: java assert assertions

这不是一个“问题”所以我正在制作CW。

assert

关键字很棒!

应该让你觉得你的自己对你编写的代码更有信心,但是,直到今天,当我创建一个小型测试类(< 20行)时,我意识到自从它被引入以来从未使用它。

的Heck!我几乎不使用记录器,这确实非常有用,但直到今天我才意识到我不使用断言。

你使用断言吗?如果不是,那是什么原因?

16 个答案:

答案 0 :(得分:15)

我被教导在90年代使用了很多断言,他们很有道理。这是很好的防御性编码。

但是,我认为现在已经被单元测试所取代,这实际上会强制代码运行并告诉它在哪里被破坏。调试断言需要有人实际运行调试代码并查看ui或日志。单元测试可以实现自动化。

答案 1 :(得分:14)

我一直都在使用它们。他们是练习“早期崩溃”理念的好方法,最好不得不解决为什么断言失败而不是处理坏/损坏的输出。

问题是你必须养成一种习惯。我很少看到其中的任何中间立场,人们要么不习惯它,几乎从不使用它们或人们使用它们,并且它们在整个代码中严格乱丢。你只需要注意到“哦,嘿,我在这里不假思索,让我明确确认它'断言(假设)'”

答案 2 :(得分:10)

我使用断言来确保我的代码中不会引入错误。如果我知道一个值应该在一个映射中,我断言(使用assert关键字)。如果我知道参数永远不应该为null,那我就断言了。如果我知道参数可以为null,那么我将检查它并抛出相应的异常。

我在Code Complete或Effective Java中读取它 - 应该使用断言来检测编程错误 - 应该使用异常来处理异常但可能的情况。如果您知道该值不为null(由合同定义),则不需要在代码的每个方法上检查null,但如果值不为null则断言也没有坏处。仅当您为VM指定​​参数-ea时才会启用断言,如果禁用它们,它们不应影响应用程序的性能。

您也应该使用更多日志:-)。了解何时使用跟踪,调试和信息,并确保记录应用程序执行的所有操作。当您必须弄清楚为什么某些东西在生产环境中不起作用时,它会让生活变得更加轻松。

答案 3 :(得分:4)

简短回答 - 是的。

长答案 - 并非总是如此,但经常。我通常使用断言来处理错误,我知道我无法做任何事情(当程序运行时)并且实际上并不需要记录。例如 - 如果我必须检查某个值是否超出范围,或者指针是否为NULL,即使它应该有一些值。

对于“解析文件”和“无法找到文件”等其他内容,我通常会抛出异常。这样我就可以记录错误并使用一些故障安全文件/方法。

我非常赞同Falaina,你真的应该注意到 - “嘿!我在这里做了一些假设”

答案 4 :(得分:4)

引入单元测试后断言的唯一真正用途是将方法的不变量传递给其他程序员。在实际代码中执行此操作要比在他们无论如何都会忽略的注释中更好。很难忽略断言!

答案 5 :(得分:3)

我不使用它们。单元测试应该足以测试您的代码。此外,由于它们在默认情况下被禁用,因此它们通常完全被忽略。然后他们只是倾向于用无用的断言来混淆你的代码,这些断言可以更好地表达为注释。

但是,如果你确实需要这个,那么一些库有你可以调用的断言静态方法 not 不会被跳过 - 这些也更具可读性,因为assert关键字不常见且可能立即导致“wtf”时刻,但Assert.x方法只是可以追踪的方法。特别是Spring框架使用断言库。

答案 6 :(得分:2)

不,从不使用它们。不知道为什么,从来没有习惯过。

答案 7 :(得分:2)

如果你喜欢断言,你会喜欢合约。它们基本上是将断言扩展到更多情况的想法。

答案 8 :(得分:2)

是的!总是!关键字是我在各种语言中最好的朋友!

没有真正的理由不使用断言,它们确保我对输入值和状态所做的基本假设得到维护。

如果断言失败,则意味着我需要重新评估我的假设并更新代码以处理在编写当前版本时我没有想到的新奇特输入。有什么不喜欢的?

与编程中一样,它只是在正确使用时才有效。

答案 9 :(得分:2)

是的,我一直使用断言,基本上每当我假设:

  1. 可以使用相当简单的谓词进行检查。
  2. 仅仅通过阅读附近的代码显然不是真的。
  3. 但是,对于可能对性能产生微不足道影响的断言,我使用D编程语言标准库中的enforce函数而不是assert。这与assert基本相同,只是它在发布模式下保持不变。对于更昂贵的断言,我使用assert,它从发布模式构建中剥离。

答案 10 :(得分:1)

我倾向于检查错误情况并反而抛出异常。原因是我希望始终检查这些条件,即使在生产中也是如此,并且异常提供了更容易处理失败条件而不是断言。

答案 11 :(得分:1)

Java assert关键字已经过了一半(需要使用-ea命令行选项运行程序),所以我发现自己依赖于异常而不是断言。

答案 12 :(得分:0)

我倾向于不使用它们,虽然我也不确定为什么。

如果您进行单元测试,例如使用nUnit,您显然会一直使用它们来验证您的测试结果。

答案 13 :(得分:0)

不,我不使用它们。

我被教导,断言不应该用在'生产'代码中,并且在我开始使用我必须删除的东西之前 - 根据我学到的东西 - 我坚持使用异常来验证条件。

答案 14 :(得分:0)

我从来没有习惯使用它们,但是我调试上一个程序的时间非常糟糕,并且在某一时刻记录变量为空或不包含我期望的值。一旦我完成所有工作,我就断言我的程序需要的所有东西才能成功运行。

答案 15 :(得分:0)

没有。但是等不及了。我曾经用junit对所有东西进行单元测试,但那是学校,小项目没有压力。我现在在现实生活中,我应该昨天完成这段代码......