抛出异常或返回值

时间:2017-08-24 09:46:17

标签: java exception-handling coding-style

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

    public boolean isAnyAngleGreaterThan(double deg);

我的问题如下:

如果&#39; deg&#39;我应该抛出illegalArgumentException不在0 <范围内。 &#39;度&#39; &LT;如果deg是&lt; = 0,我应该简单地返回TRUE,如果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;
}

其中&#39; aDeg&#39;,&#39; bDeg&#39;和&#39; cDeg&#39;是三角形中的角度a,b和c。

4 个答案:

答案 0 :(得分:1)

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

因此, 几乎从未执行有效性检查。参数验证应该尽可能在最浅层进行,即尽可能接近输入/读取值的位置。这是Fail Fast范例。

这是一个核心对象。它不应该对参数检查负责,因为它应该负责访问结果的安全性或者它返回的结果的加密。

您应该在模型代码中验证参数的唯一时间是某些参数可能导致其他问题。在你的情况下,你所比较的是其他double值,那么应该没有任何问题。

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

答案 1 :(得分:0)

一般规则是:不要将异常用作流量控制

因此:

  • 如果该方法的结果导致了其他内容,那么稍后会抛出异常,那么您应该返回boolean

  • 如果使用此方法的结果来确定是否需要抛出异常,那么该方法可以抛出异常本身(并且应该是void)。

答案 2 :(得分:0)

就个人而言,你的函数意味着一个基本的检查 - 三角形的角度是否大于参数。这并未说明对角度的限制因此应仅返回true / false值。但是,如果使用用户定义的参数调用此函数,则可能使验证/错误反馈更容易返回指示参数无效的异常。

这实际上是您的语义/个人偏好的问题。这实际上取决于你希望你的功能做什么。

答案 3 :(得分:0)

如果度数小于或等于0,您可以抛出IllegalArgumentException,如果大于180,则返回false。

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