“断言”关键字有什么作用?

时间:2010-06-10 21:31:11

标签: 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);
}

8 个答案:

答案 0 :(得分:227)

如果您使用-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 Language Specification: 14.10. The assert Statement说明如下:

  

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

使用-ea开关控制“启用或禁用”“报告错误”表示投放了AssertionError


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

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

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

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


此帖子已被重写为文章here

答案 1 :(得分:12)

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

但是必须启用断言;否则assert表达式什么都不做。参见:

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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

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

让它变得非常简单:

当你遇到类似的情况时:

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

    strB = strA.toLowerCase(); 

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

<强> 1。禁用警告。

<强> 2。如果发生最糟糕的事情(运行应用程序时),则抛出异常错误。

有时,当你编译代码时,你没有得到你的结果,这是一个错误。但是应用程序不会崩溃,你花费很多时间来找到造成这个错误的地方。

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

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

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

答案 4 :(得分:1)

  

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

     

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

JavaDoc

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

如果在打开断言的情况下运行应用程序,

Assert会抛出AssertionError。

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

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

它将抛出 java.lang.AssertionError