什么是“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
。
但是,必须启用断言。 否则assert
expression式什么都不做。 看到:
http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
assert
是一个debugging工具,如果条件不正确,会导致程序抛出一个AssertionFailed
exception。 在这种情况下,如果其后面的两个条件中的任何一个评估为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