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 语言规范:14.10。
assert
声明内容如下:
由14.10。
声明assert
断言是包含布尔表达式的语句。断言可以“启用”或“禁用”。如果启用断言,则断言的执行会导致布尔表达式的计算,并且如果表达式计算结果为assert
false
,则会报告错误。如果断言被禁用,则断言的执行没有任何效果。 其中 “启用或禁用”
-ea
开关控制,“报告错误”
表示抛出
AssertionError
。
最后,assert
您可以像这样附加
: "Error message"
assert d != null : "d is null";
指定抛出的 AssertionError 的错误消息应该是什么。如果不满足条件,则会抛出
AssertionFailed
异常。 在这种情况下,如果程序后面的两个条件中的任何一个计算结果为 false,则程序将引发异常。一般来说,
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(最坏的情况发生),它将停止应用程序并向您抛出一个错误来定位它。
它确保表达式返回 true。 否则,它会抛出
int a = 42;
assert a >= 0 && d <= 10;
如果您运行此命令,请说:
java -ea -jar peiska.jar
它将抛出一个 java.lang.AssertionError