我正在从K& B练习考试中获取此代码片段。
public class Later {
public static void main(String[] args) {
boolean earlyExit = new Later().test1(args);
if (earlyExit) assert false; // LINE 5
new Later().test2(args);
}
boolean test1(String[] a) {
if (a.length == 0) return false;
return true;
}
private void test2(String[] a) {
if (a.length == 2) assert false; // LINE 13
}
}
K& B中的答案指出,LINE-5和LINE-13不合适地使用断言。 我想知道为什么。这是我在阅读断言主题后的观察结果 K&安培; B
1.我明白,第5行是不合适的,因为它使用断言进行验证 命令行参数。永远不应该使用断言来验证命令行参数。
2.作为回答,它还指出,LINE 13也适用于断言。好的做法 在断言中声明,您可以使用断言来验证私有方法的参数。所以 我的问题是为什么LINE 13不适合使用断言。
对此的任何见解都会有所帮助。
答案 0 :(得分:1)
断言用于检查代码不变量。您永远不应该使用断言进行输入验证,因为通常它们在运行时被禁用,这就是LINE 5不合适的原因。
问:断言主张我们可以使用断言来验证私有方法。
答:是的,您可以使用断言来验证私有方法的参数,因为它们对公众不可见 - 即如果断言失败则意味着在调用者的某处存在逻辑/程序员错误,但我建议使用if / else / exceptions构造。正如我上面所说,你永远不应该验证公共方法,因为在实践中每个人都可以向方法传递任何东西,如果断言被禁用,则会发生坏事:)
答案 1 :(得分:1)
Assertion(java中的断言关键字)用于验证代码,前提条件或后置条件中的不变量的正确性。它们用于测试您在代码中的假设,以捕获不一致的状态,并且通常是错误指示或不需要的流程执行。
断言被默认禁用,因为它们不应该投入生产并且未执行断言代码
public class AssertionTest {
private boolean productionCode(){
System.out.println("Prodution code executed");
return true;
}
private void assertion() {
assert productionCode();
}
}
启用断言输出的是:
Prodution code executed
并且断言禁用输出是...... 没有! 所以要小心
语法:
assert <boolean expression>;
如果为false则抛出AssertionError assert <boolean expression> : <expression with value>
如果为false则抛出带有详细消息的AssertionError 在你的例子中
private void test2(String[] a) {
if (a.length == 2) assert false; // LINE 13
}
你正在以错误的方式使用它,因为正确的方法是
private void test2(String[] a) {
assert (a.length != 2);
}
表示:a
必须有lenght
不等于2其他是错误
阅读here以获取Oracle文档。