137

做什么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);
}
4

8 回答 8

236

如果您使用-enableassertions(或-ea简称)启动程序,则此语句

assert cond;

相当于

if (!cond)
    throw new AssertionError();

如果您在没有此选项的情况下启动程序,则 assert 语句将无效。

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

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

(如果您使用-enableassertions它启动。)


正式地,Java 语言规范:14.10。assert声明说如下

14.10。assert语句断言是包含布尔表达式的语句断言被启用或禁用如果启用了断言,则执行断言会导致对布尔表达式求值,如果表达式求值为 ,则会报告错误如果断言被禁用,则断言的执行没有任何效果。
assertfalse

其中“启用或禁用”-ea开关控制,“报告错误”表示AssertionError抛出错误。


最后,一个鲜为人知的特性assert

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

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

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


这篇文章在这里被改写为一篇文章。

于 2010-06-10T21:40:22.790 回答
12

如果不满足条件,AssertionError则会抛出 an 。

但是,必须启用断言;否则assert表达式什么也不做。看:

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

于 2010-06-10T21:36:29.893 回答
5

assertAssertionFailed是一个调试工具,如果条件不成立,会导致程序抛出异常。在这种情况下,如果程序后面的两个条件中的任何一个评估为假,程序就会抛出异常。 一般来说,assert不应该在生产代码中使用

于 2010-06-10T21:33:51.107 回答
5

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

让它很容易理解:

当您遇到类似的情况时:

    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(最坏的情况发生),它将停止应用程序并向您抛出错误以定位它。

于 2014-06-13T06:16:06.600 回答
1

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

详细消息的目的是捕获和传达断言失败的详细信息。该消息应该允许您诊断并最终修复导致断言失败的错误。请注意,详细消息不是用户级别的错误消息,因此通常没有必要将这些消息孤立地理解,或者将它们国际化。详细消息旨在与包含失败断言的源代码一起在完整堆栈跟踪的上下文中进行解释。

JavaDoc

于 2010-06-10T21:34:52.337 回答
1

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

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

于 2010-06-10T21:46:24.387 回答
0

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

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

于 2010-06-10T21:33:40.413 回答
0

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

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

如果你运行它,说:java -ea -jar peiska.jar

它应该抛出一个java.lang.AssertionError

于 2010-06-10T21:37:00.313 回答