什么是“assert”关键字呢?

什么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); } 

如果你用-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。 assert声明如下:

14.10。 assert声明
断言是包含布尔expression式的assert语句。 断言是启用或禁用 如果启用了断言,断言的执行会导致评估布尔expression式,如果expression式计算结果为false 则会报告 false 如果断言被禁用,则断言的执行不起任何作用。

使用-ea开关控制“启用或禁用”“报告错误”意味着引发AssertionError


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

你可以附加: "Error message"是这样的:

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

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


这篇文章在这里被重写为一篇文章。

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

但是,必须启用断言。 否则assertexpression式什么都不做。 看到:

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

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

虽然我已经阅读了很多有关这个文档的文档,但是我仍然对使用它的方式,时间和地点感到困惑。

让它很容易理解:

当你有类似这样的情况:

  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.抛出exception错误如果最糟糕的事情发生(当你运行你的应用程序)。

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

所以,如果你坚持这样的话:

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

你告诉编译器,strA绝对不是一个空值,它可以“平静地”closures警告。 如果它是NULL(最糟糕的情况发生),它将停止应用程序,并向您发送一个错误来find它。

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

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

的JavaDoc

断言通常主要用作检查程序预期行为的手段。 在大多数情况下,这应该会导致崩溃,因为程序员对程序状态的假设是错误的。 这是断言的debugging方面的地方。它们创build了一个检查点,如果我们想要有正确的行为,我们根本无法忽略。

在你的情况下,它会对传入的参数进行数据validation,尽pipe它不会阻止客户将来滥用该function。 特别是如果他们不是,(不应该)被包含在发布版本。

它确保expression式返回true。 否则,它会抛出一个java.lang.AssertionError

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

如果运行开启了断言的应用程序,Assert会抛出一个AssertionError。

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

如果你运行这个,说: java -ea -jar peiska.jar

它应该抛出一个java.lang.AssertionError