正确使用Java“assert”关键字

时间:2013-09-20 01:19:51

标签: java assert

我从来没有理解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?
}

如果这是正确的,请告诉我如何在这种情况下使用它。如果这不是它应该如何使用,请提供一个例子。

3 个答案:

答案 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;

在切换块的最开头,以确保只传入01

P.S。关于when to use assertion vs exception的讨论可能有助于您的理解。这个想法是

  

异常在断言时解决应用程序的健壮性问题   解决申请的正确性。

答案 2 :(得分:4)

断言主要用于检查永远不会发生的事情。 一些断言使用来自http://www.javapractices.com/topic/TopicAction.do?Id=102

的案例

前置条件(仅限私有方法) - 方法要求其调用者满足的要求。 后置条件 - 验证方法对其调用者所做的承诺 class invariants - 验证对象状态 运行时无法访问的代码 - 您希望无法访问的程序部分,但在编译时无法进行验证(通常是switch语句中的子句和默认情况)

因此,代码中断言的使用不正确