gpt4 book ai didi

java - 在 Java 中使用 AssertionError 和断言

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:19 24 4
gpt4 key购买 nike

我以标准方式在 Java 中使用断言,并在我的 IDE 中启用它们。所以它们不是产品发布的一部分。最近,我看到了带有 throw new AssertionError() 的代码示例,我开始思考应该使用 AssertionError 而不是断言的情况。

我的猜测是,主要区别在于断言的可选性,因此它们不会降低生产性能,因此它们可以在代码中经常出现,但修复用户报告的难以重现的错误更难。

对于 AssertionError,恰恰相反。

我还发现 AssertionError 在代码中不应该执行的地方更实用,而不是使用 assert false//We should not be here。特别是如果需要返回值。例如:

int getFoo(AnEnum a){
if (a == AnEnum.ONE)
return bar();
else if (a == AnEnum.TWO)
return SOME_VALUE;
//else
assert false; //throw new AssertionError();
return -1; //not necessary when usin AssertionError
}
  • 我的推理是否正确?
  • 其他差异/用例/最佳实践/限制是什么哪种方法?
  • 关于在 AssertionError 中提供描述 - 是否应该提供它,或者仅仅是它是一个 Error 的事实(并且断言类型)足以或多或少地确定堆栈跟踪将在发现错误的情况下提供?

最佳答案

在技术说明中 "Programming With Assertions: Control Flow Invariants"给出以下代码:

void foo() {
for (...) {
if (...)
return;
}
assert false; // Execution should never reach this point!
}

但也给出了以下注释:

Note: Use this technique with discretion. If a statement is unreachable as defined in the Java Language Specification, you will get a compile time error if you try to assert that it is not reached. Again, an acceptable alternative is simply to throw an AssertionError.


您可能不希望在断言关闭时抛出 AssertionError。由于 AssertionError 构造函数是公共(public)的,并且由于可能没有替代 AssertionError(String message, Throwable cause),我想您应该期待即使它们已关闭。


正如 Jon Skeet 所建议的那样,在无法访问的代码(即没有任何要计算的真实表达式)上抛出 AssertionError 永远不会减慢代码速度,因此它不会影响性能。


所以最后抛出 AssertionError 似乎没问题。

关于java - 在 Java 中使用 AssertionError 和断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22053306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com