我在GWT代码中看到了某个地方,就像这样
assert display instanceof Widget : "display must extend Widget";
答案 0 :(得分:11)
assert
关键字,顾名思义,对代码进行断言。它用于指定一直保持为真的东西 - 或者至少应该是真的!
assert
关键字后跟一个布尔值(true
或false
),或一个要在运行时计算的表达式,它返回一个布尔值。
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