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); }
它确保表达式返回 true,否则抛出 java.lang.AssertionError。
java.lang.AssertionError
Http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10
assert是一个调试工具,如果条件不为真,它会导致程序抛出 AssertionFailed异常。在这种情况下,如果程序后面的两个条件中的任何一个的计算结果为 false,则程序将引发异常。一般来说,assert不应该用在生产代码中
AssertionFailed
使用此版本的断言语句为 AssertionError 提供详细信息。系统将 Expression2的值传递给适当的 AssertionError 构造函数,该构造函数使用值的字符串表示形式作为错误的详细信息。 详细信息的目的是捕获和通信断言失败的详细信息。该消息应该允许您诊断并最终修复导致断言失败的错误。请注意,详细信息不是用户级别的错误信息,因此通常没有必要让这些信息隔离地可以理解,或者将它们国际化。详细信息需要在完整堆栈跟踪的上下文中,连同包含失败断言的源代码一起进行解释。
使用此版本的断言语句为 AssertionError 提供详细信息。系统将 Expression2的值传递给适当的 AssertionError 构造函数,该构造函数使用值的字符串表示形式作为错误的详细信息。
详细信息的目的是捕获和通信断言失败的详细信息。该消息应该允许您诊断并最终修复导致断言失败的错误。请注意,详细信息不是用户级别的错误信息,因此通常没有必要让这些信息隔离地可以理解,或者将它们国际化。详细信息需要在完整堆栈跟踪的上下文中,连同包含失败断言的源代码一起进行解释。
JavaDoc
如果条件不满足,将抛出 AssertionError。
AssertionError
但是,必须启用断言; 否则 assert表达式什么也不做。请参阅:
Http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
如果启用断言运行应用程序,则 Assert 确实会抛出 AssertionError。
int a = 42; assert a >= 0 && d <= 10;
如果使用以下命令运行此命令,比如: 罐
它会抛出一个 错误
如果您使用 -enableassertions(或简称 -ea)启动程序,那么以下语句
-enableassertions
-ea
assert cond;
相当于
if (!cond) throw new AssertionError();
如果不使用此选项启动程序,则断言语句将没有任何效果。
例如,在你的问题中提到的 assert d >= 0 && d <= s.length();相当于
assert d >= 0 && d <= s.length();
if (!(d >= 0 && d <= s.length())) throw new AssertionError();
(如果使用 -enableassertions启动,则为。)
Java 语言规范: 14.10. assert语句的正式说法如下:
14.10. assert声明 断言是包含布尔表达式的 assert语句。断言是 启用或禁用。如果启用了断言,则执行断言将导致计算布尔表达式,如果表达式计算结果为 false,则计算 报告错误。如果断言被禁用,则断言的执行没有任何效果。
false
其中 “启用或禁用”由 -ea开关控制,而 “报告错误”意味着抛出 AssertionError。
您可以像下面这样附加 : "Error message":
: "Error message"
assert d != null : "d is null";
指定引发的 AssertionError 的错误消息应该是什么。
这篇文章已被改写为文章 给你。
断言通常主要用于检查程序的预期行为。在大多数情况下,它应该会导致崩溃,因为程序员对程序状态的假设是错误的。这就是断言的调试方面的用武之地。它们创建了一个检查点,如果我们想要有正确的行为,我们就不能忽略它。
在您的例子中,它对传入的参数进行数据验证,尽管它不能防止客户机在将来误用该函数。特别是如果它们不包含在发布版本中(也不应该包含在发布版本中)。
尽管我已经阅读了很多关于这个问题的文档,但是我仍然对如何、何时以及在何处使用它感到困惑。
让它变得简单易懂:
当你遇到类似的情况:
String strA = null; String strB = null; if (2 > 1){ strA = "Hello World"; } strB = strA.toLowerCase();
您可能会收到警告(在 strB = strA.toLowerCase () ; 上显示黄线) ,说明 strA 可能为 strB 生成 NULL 值。尽管您知道 strB 绝对不会最终为空,但是为了以防万一,您使用断言
1. 取消警告。
如果最坏的情况发生(当您运行应用程序时) ,抛出异常错误。
有时,当您编译代码时,您得不到结果,这是一个 bug。但是应用程序不会崩溃,而且您会花费很多时间来查找导致这个 bug 的原因。
所以,如果你把断言,像这样:
assert strA != null; //Adding here strB = strA .toLowerCase();
你告诉编译器 strA 绝对不是空值,它可以“和平地”关闭警告。如果它是 NULL (最坏的情况发生) ,它将停止应用程序并抛出一个错误给你找到它。