正确使用 Java “assert” 关键字

2022-09-03 04:58:13

我从来不明白它的用途,即使我读过很多例子,他们并没有真正让我知道我应该用它来做什么或为什么。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?
}

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


答案 1

在这种情况下不可以。

如果你断言一个值,你是在声明,在使用此值进行一些关键评估之前,它就是你断言它的样子。在到达关键代码块之前,您可以断言该值不为 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");
}

答案 2
assert object != null;
object.doSomething();

assert用于验证某些前提条件、不变条件或后置条件的正确性。在示例中,我们要确保在调用某个方法时不这样做。objectnull

要记住的一件事是,永远不应该在生产代码中执行。我们只在测试时使用它。有一个Java选项可以打开或关闭它。assert

至于您的具体示例,您可以使用:

assert mode == 0;
assert mode == 1;

在开关块的最开始,以确保仅和传递。01

附言:关于何时使用断言与异常的讨论可能有助于您的理解。这个想法是

异常解决应用程序的健壮性,而断言则解决应用程序的正确性。


推荐