抛出异常或 return 一个值

Throw exception or return a value

我的问题很简单。 我有一个名为 Triangle 的 class。这个class有个方法;

    public boolean isAnyAngleGreaterThan(double deg);

我的问题如下:

如果 'deg' 不在 0 < 'deg' < 180 范围内,我应该抛出 illegalArgumentException 还是应该 return TRUE 如果 deg <= 0 , 如果 deg >= 180?

则为 FALSE

或者哪一个是最优选的?

1

public boolean isAnyAngleGreaterThan(double deg) {
    if (Double.compare(0, deg) >= 0) {
        throw new IllegalArgumentException("Angle (deg) can't be negative.");
    } else if (Double.compare(180, deg) <= 0) {
        throw new IllegalArgumentException("Angle (deg) can't be greater or equal than 180.");
    }

    return Double.compare(aDeg, deg) > 0
            || Double.compare(bDeg, deg) > 0
            || Double.compare(cDeg, deg) > 0;
}

2

public boolean isAnyAngleGreaterThan(double deg) {
    return Double.compare(aDeg, deg) > 0
            || Double.compare(bDeg, deg) > 0
            || Double.compare(cDeg, deg) > 0;
}

其中 'aDeg'、'bDeg' 和 'cDeg' 是三角形中的角 a、b 和 c。

一般规则是:不要使用异常作为流程控制

因此:

  • 如果该方法的结果导致其他结果然后抛出异常,那么您应该 return boolean.

  • 如果此方法的结果用于查明是否需要抛出异常,则该方法本身可以抛出异常(应该是 void)。

就个人而言,您的函数暗示了一项基本检查 - 三角形的角度是否大于参数。这并不是说对角度有限制,因此应该只有 return 一个 true / false 值。但是,如果使用用户定义的参数调用此函数,那么它可能会使验证/错误反馈更容易 return 表明参数无效的异常。

这确实是您的语义/个人喜好的问题。这实际上取决于您希望函数执行的操作。

如果度数小于或等于 0,你可能会抛出 IllegalArgumentException,如果度数大于 180,你可能会抛出 return false。

前者的原因是多边形的角度在数学意义上总是正的。后者的原因是多边形的角度可能大于180,当然不是三角形,但在一般数学意义上,角度大于180度是有效的。

我从对象的名称推测这个对象是用来表示一个三角形的。因此,它将驻留在您的代码区域中,该区域通常称为 model,通常包含系统状态。

因此,我几乎从不在此处执行有效性检查。参数验证应尽可能在最浅层进行,即尽可能靠近值为 entered/read 的位置。这是 Fail Fast 范式。

这是一个核心对象。它不应该负责参数检查,正如它不应该负责访问结果的安全性或结果的加密 returns.

只有在某些参数可能会导致其他问题时才应验证模型代码中的参数。在您的情况下,因为您要比较的是其他 double 值,那么应该没有任何问题。

例如,如果要执行某些可能导致异常(例如除以零)或其他不良影响的计算,那么在这种情况下 Fail Fast 和检查零值并抛出异常。