这个问题在这里已经有答案了:

什么是 assert 做?例如在函数中:

private static int charAt(String s, int d) {
    assert d >= 0 && d <= s.length();
    if (d == s.length()) return -1;
    return s.charAt(d);
}
有帮助吗?

解决方案

如果你启动你的程序 -enableassertions (或者 -ea 简称)然后这个声明

assert cond;

相当于

if (!cond)
    throw new AssertionError();

如果您在没有此选项的情况下启动程序,则断言语句将不起作用。

例如, assert d >= 0 && d <= s.length();, 正如您的问题中所发布的,相当于

if (!(d >= 0 && d <= s.length()))
    throw new AssertionError();

(如果您启动时使用的是 -enableassertions 那是。)


正式地, Java语言规范:14.10。这 assert 陈述 说如下:

14.10。这 assert 陈述
断言是一个 assert 包含布尔表达式的语句。一个断言是 启用或禁用. 。如果启用断言,则断言的执行会导致布尔表达式的计算,并且 报错 如果表达式的计算结果为 false. 。如果断言被禁用,则断言的执行不会产生任何影响。

在哪里 “启用或禁用” 控制与 -ea 开关和 “报告错误” 意味着一个 AssertionError 被抛出。


最后,还有一个鲜为人知的功能 assert:

您可以附加 : "Error message" 像这样:

assert d != null : "d is null";

指定抛出的 AssertionError 的错误消息应该是什么。


这篇文章已被重写为一篇文章 这里.

其他提示

如果不满足条件,则 AssertionError 将被抛出。

不过,必须启用断言;否则 assert 表达式没有任何作用。看:

http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable

assert 是一个调试工具,它会导致程序抛出一个错误 AssertionFailed 如果条件不成立则异常。在这种情况下,如果程序后面的两个条件中的任何一个计算结果为 false,则程序将引发异常。 一般来说, assert 不应该在生产代码中使用

尽管我已经阅读了很多有关此的文档,但我仍然对如何、何时以及在何处使用它感到困惑。

让它变得非常简单易懂:

当你遇到类似的情况时:

    String strA = null;
    String strB = null;
    if (2 > 1){
        strA = "Hello World";
    }

    strB = strA.toLowerCase(); 

您可能会收到警告(在 strB = strA.toLowerCase(); 上显示黄线;) strA 可能会向 strB 生成 NULL 值。虽然你知道strB最终绝对不会为null,但为了以防万一,你使用assert来

1.禁用警告。

2.如果发生最坏的情况(当您运行应用程序时),则抛出异常错误。

有时,当您编译代码时,您没有得到结果,这是一个错误。但应用程序不会崩溃,并且您会花费非常困难的时间来查找导致此错误的位置。

因此,如果你放置断言,如下所示:

    assert strA != null; //Adding here
    strB = strA .toLowerCase();

你告诉编译器 strA 绝对不是空值,它可以“和平”地关闭警告。如果它是 NULL(最坏的情况发生),它将停止应用程序并向您抛出一个错误来定位它。

使用此版本的断言语句来提供 AssertionError 的详细消息。系统将 Expression2 的值传递给相应的 AssertionError 构造函数,该构造函数使用该值的字符串表示形式作为错误的详细消息。

详细消息的目的是捕获并传达断言失败的详细信息。该消息应该允许您诊断并最终修复导致断言失败的错误。请注意,详细消息不是用户级错误消息,因此通常没有必要单独使这些消息易于理解或将其国际化。详细消息应在完整堆栈跟踪的上下文中结合包含失败断言的源代码进行解释。

Java文档

断言通常主要用作检查程序预期行为的一种手段。在大多数情况下,它应该会导致崩溃,因为程序员对程序状态的假设是错误的。这就是断言的调试方面的用武之地。它们创建了一个检查点,如果我们想要有正确的行为,我们就不能忽视这个检查点。

在您的情况下,它会对传入参数进行数据验证,尽管它并不能阻止客户端将来滥用该功能。特别是如果它们没有(也不应该)包含在发布版本中。

它确保表达式返回 true。否则,它会抛出一个 java.lang.AssertionError.

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10

如果您在打开断言的情况下运行应用程序,Assert 确实会引发 AssertionError。

int a = 42;
assert a >= 0 && d <= 10;

如果您运行此命令,请说: java -ea -jar peiska.jar

它将抛出一个 java.lang.断言错误

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top