“assert”关键字有什么作用? [重复]

问题描述 投票:0回答:8

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);
}
java assert assertion
8个回答
243
投票

如果您使用

-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 的错误消息应该是什么。
    

如果不满足条件,则会抛出

12
投票

但是必须启用断言;否则 
assert

表达式不会执行任何操作。参见:

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


6
投票
是一个调试工具,如果条件不成立,它将导致程序抛出

AssertionFailed

 异常。  在这种情况下,如果程序后面的两个条件中的任何一个计算结果为 false,则程序将引发异常。  
一般来说,
assert
不应该在生产代码中使用
    

虽然我已经阅读了很多关于这个的文档,但我仍然对如何、何时以及在哪里使用它感到困惑。

5
投票
使其变得非常简单易懂:

当你遇到类似的情况时:

String strA = null; String strB = null; if (2 > 1){ strA = "Hello World"; } strB = strA.toLowerCase();

您可能会收到警告(在 strB = strA.toLowerCase(); 上显示黄线),指出 strA 可能会向 strB 生成 NULL 值。虽然你知道strB最终绝对不会为null,但为了以防万一,你使用assert来

1。禁用警告。

2。如果发生最坏的情况(当您运行应用程序时),则抛出异常错误。

有时,当您编译代码时,您没有得到结果,这是一个错误。但应用程序不会崩溃,而且您要花很长时间才能找到导致此错误的位置。

所以,如果你添加断言,就像这样:

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

你告诉编译器strA绝对不是空值,它可以“和平”地关闭警告。如果它是 NULL(最坏的情况发生),它将停止应用程序并向您抛出一个错误来定位它。
    


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

JavaDoc

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

1
投票
在您的情况下,它会对传入参数进行数据验证,尽管它并不能防止客户端将来滥用该功能。特别是如果它们没有(也不应该)包含在发布版本中。

它确保表达式返回 true。 否则,它会抛出

0
投票

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

如果您在打开断言的情况下运行应用程序,Assert 确实会抛出 AssertionError。

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

如果您运行此命令,请说:
java -ea -jar peiska.jar

它将抛出一个 java.lang.AssertionError

© www.soinside.com 2019 - 2024. All rights reserved.