当前位置: 首页 > 知识库问答 >
问题:

在java中使用AssertionError和断言

公孙志
2023-03-14

我以标准方式在Java中使用断言,在IDE中启用它们。因此,它们不是产品发布的一部分。最近,我看到了<code>抛出新的断言错误()的代码示例

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

对于AssertionError,正好相反。

我还发现断言错误在代码中不应该执行的地方更实用,而不是使用assert false//我们不应该在这里。特别是如果需要返回值。例如:

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
}
  • 我的推理正确吗
  • 两种方法的其他差异/用例/最佳实践/限制是什么
  • 关于在<code>断言错误(以及断言类型)这一事实是否足以或多或少确保在发现错误时提供堆栈跟踪

共有2个答案

东方夕
2023-03-14

我建议不要直接抛出<code>断言错误if子句包围它。你明白了
正如您不希望将一个神奇的数字硬编码到代码中的许多地方,并且可能会使用一个常量,您也不应该用许多重复来感染代码(即<code>抛出新的断言错误(…)

不过,这是关于断言的另一个词。我认为,在依赖生产代码中的断言错误之前,您应该三思。原因是断言错误非常通用。它有一个信息和一个原因,但差不多就是这样
考虑使用特定的<code>RuntimeException作为一个简单的例子,考虑您在问题中提到的一个案例,其中代码的某些部分是您不希望达到的。断言或<code>断言错误

松铭
2023-03-14

在技术说明“使用断言编程:控制流不变量”中给出了以下代码:

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

但也给出了以下说明:

注意:谨慎使用此技术。如果Java语言规范中定义的语句无法访问,如果您尝试断言未访问它,则会收到编译时错误。同样,一个可接受的替代方法是简单地抛出AssertionError。

当断言关闭时,您可能不希望抛出<code>断言错误。由于<code>AssertionError很可能没有替代物,因此即使它们关闭,我猜您也应该期望它们。

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

因此,最后抛出<code>断言错误

 类似资料:
  • 问题内容: 在我编写的测试中,如果要断言页面上存在WebElement,可以执行以下操作: 如果存在,它将通过,如果不存在,则将炸毁。但现在我想断言的链接本身 并不 存在。我不清楚如何执行此操作,因为上面的代码未返回布尔值。 编辑 这就是我想出自己的解决方案的方式,我想知道是否还有更好的方法。 问题答案: 不确定您所指的是哪个版本的硒,但是硒*中的某些命令现在可以执行此操作:http : //re

  • 我试图在spring boot 2.3项目中使用JUnit5与Hibernate5.4和MockMvc。 这就是我的实体类的成员的外观: 我试图使用JUnit5用Mockito和MockMvc测试LocalDate字段birthDate。这就是测试用例的样子: 运行测试用例时,我得到一个AssertionError: 正如您所看到的,这两个字符串表示形式是相同的。但是JUnit5会抛出错误。 那么

  • 在序列化/反序列化过程中,我的项目在中实现了一个,用于保留对象的多态性状态。不管怎样,该项目在开发测试中工作得很好,但当它用proguard混淆发布并测试时,它就崩溃了。 我的Gson特定的proguard配置是: 我正在使用的打字适配器是: 任何来自开发者社区的帮助都将不胜感激。

  • 我有一个webservice操作,其中我将获得SAML断言作为请求体的一部分。我跟踪XSD: saml:断言是指:< br>

  • 试图看到一个在Cucumber中使用软断言的工作示例。我有以下简单的特性和步骤定义,我故意使一些验证失败,但cucumber测试仍然显示“通过”。我是不是做错什么了。 @给定(“^I have a Scenary for Soft Assert$”)public void i_have_a_scenario_for_soft_assert()throwsable{

  • 问题内容: 尝试使用SAML 2.0解密加密的断言时遇到问题。我使用的库是OpenSAML Java库2.5.2。 加密的断言如下所示: 我确实使用以下openssl命令将PEM格式的私钥转换为pkcs8格式: 然后,我准备尝试解密加密的断言。这是我的Java代码: 运行此代码总是导致无法解密断言。我确实收到以下错误: 我真的不知道在这种情况下我在做什么错。我将私钥转换为pkcs8,加载了SAML