是“断言是假的;”一个好习惯?

时间:2016-04-07 06:13:12

标签: java error-handling assert

我目前正在编写一个函数,根据给定的条件从列表中返回一个对象。它看起来像这样:

for (Object object : list) {
    if (condition(object)) {
        return object;
    }
}

这个函数应该总是从列表中返回一些东西,如果没有找到匹配的对象,那就是一个错误的调用,一个严重的错误,程序应该停止。

因此,当我使用断言时,我在循环之后执行了以下操作:

assert false; // Will always trigger in debug mode.
return null; // No matter anyway, an AssertionException has already been thrown.

但我想知道我是否表现不错? 如果没有,我该怎么办呢?自己抛出异常?

无论如何,这种情况有什么样的规范吗?

4 个答案:

答案 0 :(得分:4)

我宁愿在调用时检查函数的返回值。

if (yourFunctionWithList(parameter) == null)
   //error handling, maybe throw new NPException or whatever. 
else
   //some object was returned

您也可以编写自己的Exception类,并以您想要的任何方式处理它。

我个人认为assert false不是好习惯。

修改

如果它是关于将被抛出的AssertionException,那么你也可以像

一样使用它
throw new AssertionError ("your error msg here");

所以你可以用同样的方式处理它

答案 1 :(得分:2)

断言或抛出异常的问题是你需要使用异常处理来处理一些非常特殊的情况。

此外,您无法确定是什么引发了您捕获的异常/断言。它可能可能被抛出到您期望的位置,但也可能被抛出过滤代码,例如 - 因此检查异常以检测“未找到”的情况可能会混淆其他问题那个案子

另一种方法是使用Optional(类似的类存在于Guava中用于Java 8之前;或者您可以简单地使用Set<Object>,但这并不表示您期望完全为0或找到1个值):

Optional<Object> method(List<?> list) {
  for (Object object : list) {
      if (condition(object)) {
          return Optional.of(object);
      }
  }
  return Optional.empty();
}

现在,在您的调用代码中,您明确知道您可能没有在列表中找到的项目:

Optional<Object> opt = method(list);
if (opt.isPresent()) {
  Object obj = opt.get();
  // Handle the fact it was found.
} else {
  // Handle the fact it wasn't found.
}

而不是异常处理,您可能忘记添加。

答案 2 :(得分:1)

我个人不相信他们;即使在开发环境中,默认情况下它们也经常被禁用。这可能会使他们产生非常错误的安全感 - 静态分析工具和其他程序员都会错误地认为它们按预期工作。

答案 3 :(得分:1)

你应该抛出一个异常,这是java中的正确方法:

for (Object object : list) {
    if (condition(object)) {
        return object;
    }
}
throw new Exception('Failed: no matching item found!');

如果你有一天改变主意并且不希望程序停止,你将能够捕获异常。