什么是“断言”关键字做什么?

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);
}
159776 次浏览

它确保表达式返回 true,否则抛出 java.lang.AssertionError

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

assert是一个调试工具,如果条件不为真,它会导致程序抛出 AssertionFailed异常。在这种情况下,如果程序后面的两个条件中的任何一个的计算结果为 false,则程序将引发异常。一般来说,assert不应该用在生产代码中

使用此版本的断言语句为 AssertionError 提供详细信息。系统将 Expression2的值传递给适当的 AssertionError 构造函数,该构造函数使用值的字符串表示形式作为错误的详细信息。

详细信息的目的是捕获和通信断言失败的详细信息。该消息应该允许您诊断并最终修复导致断言失败的错误。请注意,详细信息不是用户级别的错误信息,因此通常没有必要让这些信息隔离地可以理解,或者将它们国际化。详细信息需要在完整堆栈跟踪的上下文中,连同包含失败断言的源代码一起进行解释。

JavaDoc

如果条件不满足,将抛出 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)启动程序,那么以下语句

assert cond;

相当于

if (!cond)
throw new AssertionError();

如果不使用此选项启动程序,则断言语句将没有任何效果。

例如,在你的问题中提到的 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,则计算 报告错误。如果断言被禁用,则断言的执行没有任何效果。

其中 “启用或禁用”-ea开关控制,而 “报告错误”意味着抛出 AssertionError


最后,assert还有一个鲜为人知的特点:

您可以像下面这样附加 : "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 (最坏的情况发生) ,它将停止应用程序并抛出一个错误给你找到它。