【发布时间】:2011-04-16 16:51:27
【问题描述】:
当 Java 断言失败时究竟会发生什么?程序员如何知道断言失败了?
谢谢。
【问题讨论】:
标签: java
当 Java 断言失败时究竟会发生什么?程序员如何知道断言失败了?
谢谢。
【问题讨论】:
标签: java
如果在 JVM 中启用了断言(通过 -ea 标志),断言失败时将抛出 AssertionError。
这不应该被抓住,因为如果一个断言失败,它基本上意味着你对程序如何工作的假设之一是错误的。因此,当您在线程(可能还有整个程序)终止时记录异常堆栈跟踪时,您通常会发现断言失败。
【讨论】:
只有在启动时在 JVM 中启用了断言,断言才会失败。您可以通过在命令行中指定参数 -ea 来做到这一点。如果你这样做了,那么这段代码在执行时会抛出一个AssertionError:
public void whatever() {
assert false;
}
断言只能用于检测编程错误。如果您在这些行上验证用户输入或其他内容,请不要使用断言。
【讨论】:
它抛出一个AssertionError,它是Error 的子类。作为一个Error,特别是作为一个失败的断言,你可能不应该试图抓住它,因为它告诉你代码中有一个明显的异常,如果你继续,你可能会处于一些未定义的、不安全的状态.
【讨论】:
如果断言失败并且在运行时启用了断言,它将抛出AssertionError。
通常您在 JUnit 测试中使用断言语句,在构建应用程序时,您正在运行一个测试实用程序,该实用程序将检查错误并告诉您。
【讨论】:
AssertionFailedError),并且无法使用 JVM 标志关闭。
它抛出一个 AssertionError。但是,您必须使用 -ea 或 -enableassertions 标志编译程序才能使其生成实际异常
【讨论】:
它抛出一个Error。就像你得到一个NullPointerException 一样,但它是java.lang.Error 的一个子类。名字是AssertionError。
就像NullPointerException,你不必声明 throws 或任何东西,它只是抛出它。
assert(false);
就像
throw new AssertionError();
如果您使用传递给 java 程序 (VM) 的 -ea 标志运行程序。
【讨论】:
程序员可以编写try catch块,如果发生错误,可以在catch中捕获,程序员可以知道
try
{
assert false;
}
catch(Exception e)
{
System.out.println("Error has occured");
}
【讨论】: