在Java中断言关键字

Sta*_*lin 40 java validation assert exception

您是否使用assert关键字或抛出一些验证运行时异常?它给你带来了什么好处,或者为什么你觉得它不值得使用?

and*_*soj 65

如果条件为false,则Assert将抛出运行时错误(AssertionError).断言为您提供了一种简化的方法来记录,检查和实施代码的正确性标准.这些好处是用于定义和操纵这些正确性条件的语言级钩子.如果您希望启用或禁用它们(有关于这是否是一个好主意的争论),您可以从JVM命令行执行此操作.下面的一些评论者指出,除非在调试模式下运行,否则默认情况下会禁用断言; 我的做法是始终在我的包装器脚本中添加"-ea"(启用断言).即使在性能敏感的代码中,对我来说,权衡也有利于我从断言获得的安全性/正确性. OracleOracle的断言AssertionError的API描述

注意预期或意外故障(异常)之间的区别,这可能超出您的控制范围,并且断言失败 - 断言失败记录程序员的假设,并指出错误的程序而不是意外的外部条件或预期的异常情况. 如果发生断言失败,则解释是程序员误解或错误地表达了程序,而不是其他错误或失败的来源.

在实践中,我用它来记录我做出的明显或非显而易见的假设以及我想要生成的不变量(特别是私有/内部)代码,让我自己和其他人明白这些假设的原因,它们在哪里制作,以及它们是否经过验证.比同样效果的评论要好得多.这是通过合同设计的(小)步骤.

有效的Java项目#38"检查参数的有效性"(Google Books,Amazon.com)提供了参数检查和断言的适当使用之间区别的有用表示.

与SO相关:( 在netbeans中启用断言),(断言与异常),(接近重复,请求示例),(命名不当,但内容非常相似)

  • 想要补充说默认情况下在运行时禁用断言.有命令行开关(-enableassertions或-ea)可用于有选择地启用断言. (13认同)
  • 我认为你的意思是"在非调试代码中禁用"而不是"在运行时禁用". (2认同)

Plí*_*eão 5

andersoj 是正确的。只是为了让您知道,断言的好处在于您可以简单地将其关闭(如果您没有在 java 命令行中传递 -ea)。当您想确保不会破坏自己的代码时,这个简单的事情使它们非常适合在开发中使用。  


ker*_*vin 5

它给您带来什么好处或者为什么您认为它不值得使用?

正如其他人所建议的那样,使用断言进行强制检查是一种危险的做法

当其他开发人员使用您的库时会发生什么?或者系统管理员或高级用户忘记,或者更糟糕的是不知道,在运行时使用-ea标志启用断言?你会失去所有这些支票,就是这样。

断言是一种开发工具。该标志的默认状态是关闭的,这一事实是一个明显的泄露。

应用程序中的任何功能或优点都不应该依赖于断言的开启。

作为背景,断言在 C/C++ 中的使用方式与该功能的来源相同。#define DEBUG ...在 C/C++ 中,开发人员通常可以在编译时传入 a来启用或禁用断言。对于 C/C++ 生产代码,通常会关闭此功能。

从概念上讲,Java 也应该如此。在生产中使用条件和异常。它们本质上是同一件事。

  • 恕我直言,将其称为“**危险的做法**”有点过分。这是一种有一些缺点的做法,@kervin 已经非常雄辩地描述了这一点,但每种做法都有优点和缺点。背景将决定这些优点和缺点是否使这种做法可以接受。 (2认同)