我从来没有理解assert
使用的是什么,即使我已经阅读了很多例子,但他们并没有真正让我知道我应该使用它的原因或原因。
所以,不要问一个例子,我会提供一个例子,让我知道这是assert
的正确用法。
// The idea is that the `mode` variable should be 0 or 1, and no other number.
switch(mode) {
case 0:
// do stuff
break;
case 1:
// do other stuff
break;
default:
// assert code?
}
如果这是正确的,请告诉我如何在这种情况下使用它。如果这不是它应该如何使用,请提供一个例子。
答案 0 :(得分:19)
不是这种情况。
如果你断言了一个值,你就会发表一个声明,在使用这个值进行一些关键评估之前,你声明它就是你所声称的。您可以声明该值不为null,或者它小于2,或之前到达关键代码块。
assert (mode >= 0 && mode < 2); // Ensures that `mode` is between 0 and 1.
// Switch statement to follow
我不鼓励在这里使用它。您的代码读取不好,除非您使用-ea
标志启用断言,否则您的断言将无效。
相反,你可以做的是抛出某种异常 - 如果它不是0或1,那么mode
是一个无法处理的非法值,导致异常/未定义的行为。抛出某种例外。
switch(mode) {
case 0:
// do stuff
break;
case 1:
// do other stuff
break;
default:
throw new IllegalArgumentException("Mode is illegal");
}
答案 1 :(得分:8)
assert object != null;
object.doSomething();
assert
用于验证某些前置条件,不变量或后置条件的正确性。在示例中,我们希望在调用某个方法时确保object
不是null
。
要记住的一件事是assert
永远不应该在生产代码中执行。我们只在测试时使用它。有一个Java选项可以打开或关闭它。
至于您的具体示例,您可以使用:
assert mode == 0;
assert mode == 1;
在切换块的最开头,以确保只传入0
和1
。
P.S。关于when to use assertion vs exception的讨论可能有助于您的理解。这个想法是
异常在断言时解决应用程序的健壮性问题 解决申请的正确性。
答案 2 :(得分:4)
断言主要用于检查永远不会发生的事情。 一些断言使用来自http://www.javapractices.com/topic/TopicAction.do?Id=102
的案例前置条件(仅限私有方法) - 方法要求其调用者满足的要求。 后置条件 - 验证方法对其调用者所做的承诺 class invariants - 验证对象状态 运行时无法访问的代码 - 您希望无法访问的程序部分,但在编译时无法进行验证(通常是switch语句中的子句和默认情况)
因此,代码中断言的使用不正确