“assert”关键字有什么作用? [重复]

问题

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

  • Java断言关键字做了什么,何时应该使用它? 17个答案

assertdo是什么?例如在函数中:

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

#1 热门回答(218 赞)

如果你使用-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。 TheassertStatementsays以下内容:

14.10。断言语句断言是包含布尔表达式的断言语句。断言启用或禁用。如果断言已启用,则断言的执行会导致对布尔表达式进行求值,如果表达式求值为false,则会报告错误。如果断言被禁用,则断言的执行不会产生任何影响。

使用-ea开关控制"启用或禁用"并且"报告错误"表示抛出anAssertionError

##最后,一个鲜为人知的断言功能:

你可以像这样追加2,35274292:

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

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

此帖已被重写为文章here


#2 热门回答(12 赞)

如果不满足条件,将抛出anAssertionError

但是必须启用断言;否则assert表达式什么都不做。看到:
http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable


#3 热门回答(5 赞)

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