16

我从来不明白它的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?
}

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

4

3 回答 3

19

在这种情况下不是。

如果你在断言一个值,你就是在声明,在使用这个值进行一些关键评估之前,它就是你断言它的样子。在到达关键代码块之前,您可以断言该值不为空,或者它小于 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");
}
于 2013-09-20T01:24:17.683 回答
8
assert object != null;
object.doSomething();

assert用于验证某些前置条件、不变量或后置条件的正确性。在示例中,我们要确保object它不是null在调用某个方法时。

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

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

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

在 switch 块的最开始,以确保只有01被传入。

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

异常处理应用程序的健壮性,而断言处理应用程序的正确性。

于 2013-09-20T01:35:51.363 回答
4

断言基本上用于检查不应该发生的事情。来自http://www.javapractices.com/topic/TopicAction.do?Id=102的一些断言用例

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

所以在你的代码中使用断言是不正确的

于 2013-09-20T01:27:44.950 回答