【问题标题】:Why assertion is not enabled by default in java? [closed]为什么在java中默认不启用断言? [关闭]
【发布时间】:2015-05-19 11:36:45
【问题描述】:

默认情况下不启用断言,因此我们必须通过将-ea 传递为jvm argumentso 来启用它,

  1. 为什么默认不启用?
  2. 它的具体用途是什么?
  3. 如果我们启用它会导致性能或任何其他问题吗?

【问题讨论】:

  • 1. [为什么默认情况下不启用断言][1] 2 & 3. [使用断言是否会引发错误][2] [1]: stackoverflow.com/questions/29120928/… [2]: stackoverflow.com/questions/13218496/…
  • 1-2) 断言仅用作测试工具,它不应该是标准代码逻辑的一部分,因此客户端的 JVM 不必运行它,这就是它的原因默认禁用。 3) 取决于通常会被跳过的断言代码。
  • @GauravMahawar 使用 [description](link) 在 cmets 中发布链接。

标签: java assertions


【解决方案1】:

对于 1,2) 每个断言都包含一个布尔表达式,当断言执行时,您认为该表达式为真。如果不正确,系统将抛出错误。通过验证布尔表达式确实为真,断言确认了您对程序行为的假设,增加了您对程序没有错误的信心。

对于 3) 当您告诉编译器断言的代码返回一些您已经预期的结果时。如果代码没有返回与您预期相同的输出,那么就有可能出现致命错误或意外的内存泄漏除了断言错误。

希望这会有所帮助!

文档http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html

【讨论】:

    【解决方案2】:

    断言可用于验证(和记录)程序不变量。

    它不是为处理异常情况而设计的,所以无论如何您都不希望它对生产环境产生影响。

    是否在生产环境中启用断言是有争议的,因此 Java 可能会随意决定默认情况下不这样做,或者这样做是为了不让那些不知道的人感到困惑。

    我不认为断言会损害生产环境中的性能(前提是您不启用它们),它们可以被 JIT 编译器轻松优化掉(或完全忽略)。

    【讨论】:

    • 3) 由于默认情况下不启用断言,因此表达式(函数或简单表达式)没有副作用很重要。例如,表达式不应该改变变量的值,因为当断言打开时程序的行为会改变。一个重要的用例是在开发或 QA 环境中测试前置/后置条件(使用 -ea),并能够在无需修改代码的情况下从生产环境中删除这些测试。有些人会争辩说你可以通过方面实现类似的效果,但我发现使用断言更容易。
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-12-18
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多