关键字assert在java中意味着什么?

时间:2011-03-07 06:06:23

标签: java gwt assert

我在GWT代码中看到了某个地方,就像这样


assert display instanceof Widget : "display must extend Widget";

5 个答案:

答案 0 :(得分:11)

assert关键字,顾名思义,对代码进行断言。它用于指定一直保持为真的东西 - 或者至少应该是真的!

assert关键字后跟一个布尔值(truefalse),或一个要在运行时计算的表达式,它返回一个布尔值。

assert true;
assert 1 == 1;

如果由于任何原因,布尔表达式的计算结果为false,则抛出AssertionError

// this will throw an AssertionError:
int x = 1;
assert x == 2;

当您使用它时,您可以清楚地说明您在给定点上的程序状态,这可以使读者更容易完成您的代码。

有一个名为程序合同的编程范例,其中代码片段声明前提条件必须适用于他们正确执行,以及后置条件,这些都是有保证的在执行后保持真实。您可以使用assert关键字来实现此目的。

例如,如果您编写一个计算数字平方根的方法,它只适用于大于或等于零的数字,并且保证结果满足相同的条件:

public double sqrt(final double x) {
    assert x >= 0 : "Cannot calculate the square root of a negative number!"
    double result = ...;
    assert result >= 0 : "Something went wrong when calculating the square root!"
    return result;
}

断言最有趣的方面是你可以要求编译器将它们从字节码中删除(通过-disableassertion参数),这样你就不会得到任何生产时运行时的性能损失。出于这个确切的原因,要评估的表达式不会引起副作用是至关重要的,也就是说,表达式应该看起来像纯粹的数学函数。否则,如果编译器删除了断言,程序的行为可能会改变。

最后,如果将断言编译成字节码,则可以通过软件读取它们,该软件将自动生成试图破坏代码的测试。之前发现错误会很有用!

答案 1 :(得分:3)

assert keyword是在1.4中引入的(请点击该链接获取完整说明)。如果不满足条件,它是在运行时抛出异常的简写。

将其视为

assert condition : message

as

if ( ! condition ) {
    throw new AssertionError ( message ) ;
}

这个想法是为开发人员提供一种简单的方法来帮助用户(在您的情况下是GWT API用户)来检测常见错误/陷阱

当它被引入时,assert语句成为一个保留字,并且当为I.4重新编译旧代码时引起了一些编译问题。特别是对于使用了很多assert()方法的JUnit测试套件。 JUnit通过将assert替换为assertTrue()

来做出反应

答案 2 :(得分:0)

这意味着如果display不是Widget类型的对象,您将获得一个带有断言后面的文本字符串的AssertionError。断言有助于调试。

答案 3 :(得分:0)

assert关键字用于简化用户定义的异常。为了定义用户定义的异常,我们必须通过首先定义异常导致条件来创建我们自己的异常类,然后我们必须在程序中抛出它。 但是从java 1.5开始我们有一个关键字as assert,其中只有我们必须编写assert(condition)如果condtion为true它会执行程序的其他部分,否则如果它为false则会创建AssertionError类的对象而我们有处理它。 所以不需要定义我们的userdefind错误。

答案 4 :(得分:0)

以下文字(强调我的)清楚地解释了各种形式的断言:

  

断言语句有两种形式。

     

第一个更简单的形式是:

     

断言Expression1;

     

其中Expression1是布尔表达式。什么时候   系统运行断言,它评估Expression1,如果是的话   false抛出没有详细消息的AssertionError。

     

断言语句的第二种形式是:

     

断言Expression1:Expression2; (你的例子落在这里)

     

其中:Expression1是一个布尔表达式。 Expression2是一个表达式   有价值。 (它不能是对声明的方法的调用   void。)使用此版本的assert语句来提供详细信息   AssertionError的消息。系统传递的值   Expression2到适当的AssertionError构造函数,它使用   值的字符串表示形式为错误的详细消息。

另外,请参阅以下oracle链接以获取详细信息: http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html