关于异常:是否有返回true,false或unknown的Java约定?

Is there a Java convention for returning true, false, or unknown?

我正在写一个方法,如果某些事情是真的或不是真的,它将返回。但是,如果测试条件所需的资源不可用,它将无法返回true或false。

早些时候,我只是把它变成一个返回boolean的方法。但是现在,为了适应异常,我考虑在函数参数中传递true或false,并使用返回值作为测试的成功或失败指示器。

这是在Java中正确而常见的方式吗?或者Java中还有其他的东西来实现这个目标吗?


如果资源不可用,则方法应返回布尔值并引发异常。


如果这个方法不能计算出正确的答案,我肯定会让它抛出一个异常。

现在您必须决定是否选中或取消选中引发的异常。这真的取决于上下文。通常,我这样认为:如果调用者有办法确保方法不会失败,我会让它抛出一个未检查的异常;否则,如果调用者没有办法绝对地确保方法不会失败,那么我会让它成为一个检查过的异常。

在这种情况下,调用者可以确定故障的可能性:

1
2
3
4
5
6
7
class C1 {
  public boolean canCalculateResultNow() { ... }
  public boolean calculateResult() {
    if (cannot get resource) throw new IllegalStateException("Cannot get resource");
    ...
  }
}

现在,如果调用者不能确定该方法是否能够正常完成,我将执行以下操作:

1
2
3
4
5
6
7
class CannotCalculateResultException extends Exception { ... }
class C2 {
  public boolean calculateResult() throws CannotCalculateResultException {
    if (cannot calculate result) throw new CannotCalculateResultException();
    ...
  }
}

另一种可能是让方法返回boolean,这是boolean的一个可以为空的版本,我非常不喜欢也非常不鼓励。boolean可以是truefalsenull。然后,如果资源不可用,您可以使方法返回null

我在这种方法中看到的主要问题是,null的含义可能不清楚。调用代码总是必须检查结果是否为空,开发人员(甚至在编写此代码几个月后自己)必须阅读该方法的文档以了解空结果意味着什么。一个特定的检查异常明确地表明,有些事情可能会出错,哪些事情可能会出错。此外,它还将迫使开发人员为出现问题的情况做准备。在有未经检查的异常的方法中,方法canCalculateResult()的存在也会向使用该类的开发人员表明,在不需要阅读文档的情况下,某些事情可能会出错,并且可以合理地假定,在不首先调用canCalculateResult()的情况下调用calculareResult()是"危险的"。


我建议其他方法:有资源时不返回boolean,有资源时返回boolean,没有资源时返回null


这是正确的,但不是一个好的做法。相反,您的方法应该返回一个布尔值并处理异常(如果无法计算答案的话)。