Java 断言问题

Posted

技术标签:

【中文标题】Java 断言问题【英文标题】:Java Assertion Question 【发布时间】:2011-04-16 16:51:27 【问题描述】:

当 Java 断言失败时究竟会发生什么?程序员如何知道断言失败了?

谢谢。

【问题讨论】:

【参考方案1】:

如果在 JVM 中启用了断言(通过 -ea 标志),断言失败时将抛出 AssertionError

不应该被抓住,因为如果一个断言失败,它基本上意味着你对程序如何工作的假设之一是错误的。因此,当您在线程(可能还有整个程序)终止时记录异常堆栈跟踪时,您通常会发现断言失败。

【讨论】:

【参考方案2】:

只有在启动时在 JVM 中启用了断言,断言才会失败。您可以通过在命令行中指定参数 -ea 来做到这一点。如果你这样做了,那么这段代码在执行时会抛出一个AssertionError

public void whatever() 
   assert false;

断言只能用于检测编程错误。如果您在这些行上验证用户输入或其他内容,请不要使用断言。

【讨论】:

【参考方案3】:

它抛出一个AssertionError,它是Error 的子类。作为一个Error,特别是作为一个失败的断言,你可能不应该试图抓住它,因为它告诉你代码中有一个明显的异常,如果你继续,你可能会处于一些未定义的、不安全的状态.

【讨论】:

【参考方案4】:

如果断言失败并且在运行时启用了断言,它将抛出AssertionError。 通常您在 JUnit 测试中使用断言语句,在构建应用程序时,您正在运行一个测试实用程序,该实用程序将检查错误并告诉您。

看看这个:Programming With Assertions

【讨论】:

JUnit 断言不同于普通的 Java 断言。它们会导致抛出不同的异常 (AssertionFailedError),并且无法使用 JVM 标志关闭。 你混合了两件事。 Java 断言的形式为 'assert boolean expression' 或 'assert boolean expression : non-void expression ' 并由运行时系统检查启用。在 JUnit 测试中,像“assertEquals(a,b)”这样的语句是 JUnit 类的方法调用。【参考方案5】:

它抛出一个 AssertionError。但是,您必须使用 -ea 或 -enableassertions 标志编译程序才能使其生成实际异常

【讨论】:

不是编译时选项。这是一个运行时选项。【参考方案6】:

它抛出一个Error。就像你得到一个NullPointerException 一样,但它是java.lang.Error 的一个子类。名字是AssertionError

就像NullPointerException,你不必声明 throws 或任何东西,它只是抛出它。

assert(false);

就像

throw new AssertionError();

如果您使用传递给 java 程序 (VM) 的 -ea 标志运行程序。

【讨论】:

【参考方案7】:

程序员可以编写try catch块,如果发生错误,可以在catch中捕获,程序员可以知道

try

  assert false;

catch(Exception e)

  System.out.println("Error has occured");

【讨论】:

以上是关于Java 断言问题的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 assert (断言)

Java笔记:断言

走进Java接口测试之流式断言库AssertJ

Java Review(三十异常处理----补充:断言日志调试)

Java Review(三十异常处理----补充:断言日志调试)

断言 Android 编程