"断言"关键字有什么作用?

Pei*_*ska 134 java assert assertion

怎么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);
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 228

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

assert cond;
Run Code Online (Sandbox Code Playgroud)

相当于

if (!cond)
    throw new AssertionError();
Run Code Online (Sandbox Code Playgroud)

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

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

if (!(d >= 0 && d <= s.length()))
    throw new AssertionError();
Run Code Online (Sandbox Code Playgroud)

(如果你发布了-enableassertions那个.)


形式上,Java语言规范:14.10.该assert声明说以下内容:

14.10.的assert声明
的断言是一个assert含有一个布尔表达式语句.断言被启用或禁用.如果断言已启用,则断言的执行会导致对布尔表达式进行求值,并在表达式求值时报告错误false.如果断言被禁用,则断言的执行不会产生任何影响.

"启用或禁用"与控制-ea开关和"报告错误"是指一个AssertionError被抛出.


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

您可以这样添加: "Error message":

assert d != null : "d is null";
Run Code Online (Sandbox Code Playgroud)

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


该帖子已被改写为一篇文章在这里.

  • 使用`assert`来测试**非公共**方法的[前置条件](http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#preconditions)是完全有效的IMO . (20认同)
  • 同意,断言不应该被用来确保论证的有效性,而是指出强有力的假设. (5认同)
  • 如果客户有责任确保参数在范围内,那么使用assert是一种很好的编码方式.正如Bertrand Meyer(按合同设计)所述,这种假设避免了重复检查.使用IllegalArgumentException是公共API中的好方式.另见[答案](http://stackoverflow.com/questions/5049163/when-should-i-use-apache-commons-validate-istrue-and-when-should-i-just-use-the/5452329 #5452329)到相关的stackoverflow问题. (2认同)

Ric*_*arn 12

如果条件不满足,AssertionError将抛出一个.

但是必须启用断言; 否则assert表达什么都不做.看到:

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


Chr*_*son 5

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

  • 因为需要明确启用断言才能产生任何影响,所以在生产代码中使用它们不会有害. (4认同)

fel*_*wcf 5

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

让它变得非常简单:

当你遇到类似的情况:

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

    strB = strA.toLowerCase(); 
Run Code Online (Sandbox Code Playgroud)

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

1.禁用警告.

2.抛出异常错误如果发生最坏的事情(当你运行你的应用程序时).

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

所以,如果你把断言,像这样:

    assert strA != null; //Adding here
    strB = strA .toLowerCase();
Run Code Online (Sandbox Code Playgroud)

你告诉编译器strA绝对不是空值,它可以"安静地"关闭警告.如果它是NULL(最坏情况发生),它将停止应用程序并向您发送错误以找到它.