【发布时间】:2011-03-02 09:54:51
【问题描述】:
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);
}
【问题讨论】:
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 d >= 0 && d <= s.length();,在您的问题中发布,相当于
if (!(d >= 0 && d <= s.length()))
throw new AssertionError();
(如果您使用-enableassertions 启动。)
Java Language Specification: 14.10. The assert Statement 正式地说如下:
14.10。
assert语句
断言是包含布尔表达式的assert语句。断言启用或禁用。如果启用了断言,则执行断言会导致对布尔表达式求值,如果表达式求值为false,则报告错误。如果断言被禁用,则断言的执行没有任何效果。
其中“启用或禁用” 由-ea 开关控制,“报告错误” 表示抛出AssertionError。
assert 的一个鲜为人知的功能:您可以像这样附加: "Error message":
assert d != null : "d is null";
指定抛出的 AssertionError 的错误信息应该是什么。
此帖已改写为文章here。
【讨论】:
assert 测试非公开 方法的precondition 是完全有效的IMO。
assert 的代码吗?
虽然我已经阅读了很多关于这个的文档,但我仍然对如何、何时以及在何处使用它感到困惑。
让它很容易理解:
当你遇到类似这样的情况时:
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(最坏的情况发生),它将停止应用程序并向您抛出一个错误来定位它。
【讨论】:
assert 是一个调试工具,如果条件不成立,会导致程序抛出AssertionFailed 异常。在这种情况下,如果程序后面的两个条件中的任何一个评估为假,程序就会抛出异常。 一般来说,assert 不应该用在生产代码中
【讨论】:
AssertionError,就像任何其他异常一样。
-ea 开关启动。
断言通常主要用作检查程序预期行为的一种手段。在大多数情况下它会导致崩溃,因为程序员对程序状态的假设是错误的。这就是断言的调试方面的用武之地。它们创建了一个检查点,如果我们想要正确的行为,我们根本不能忽略它。
在您的情况下,它会对传入参数进行数据验证,尽管它不会阻止客户端将来滥用该函数。特别是如果它们没有(也不应该)包含在发布版本中。
【讨论】:
如果您在打开断言的情况下运行应用,Assert 确实会引发 AssertionError。
int a = 42;
assert a >= 0 && d <= 10;
如果你运行它,说:java -ea -jar peiska.jar
它会抛出一个java.lang.AssertionError
【讨论】:
如果条件不满足,将抛出AssertionError。
但是必须启用断言;否则 assert 表达式什么也不做。见:
http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
【讨论】:
使用此版本的 assert 语句为 AssertionError 提供详细消息。系统将 Expression2 的值传递给相应的 AssertionError 构造函数,该构造函数使用该值的字符串表示形式作为错误的详细消息。
详细消息的目的是捕获和传达断言失败的详细信息。该消息应该允许您诊断并最终修复导致断言失败的错误。请注意,详细消息不是用户级别的错误消息,因此通常没有必要将这些消息孤立地理解,或者将它们国际化。详细消息旨在结合包含失败断言的源代码在完整堆栈跟踪的上下文中进行解释。
【讨论】:
它确保表达式返回 true。否则,它会抛出一个java.lang.AssertionError。
http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10
【讨论】: