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 Review(三十异常处理----补充:断言日志调试)