对于从客户端角度看有效的无效输入,抛出哪个异常

Jav*_*per 34 java exception-handling

我正在编写代码来查找和交叉2行.当线的斜率相等时,它们不相交.但另一方面,具有相等值斜率的输入是完全有效的.

public static Point calculateIntersection(Line line1, Line line2) {

    if (line1 == null || line2 == null) {
        throw new NullPointerException(" some message ");
    }

    if (line1.getConstant() == line2.getConstant()) {
        return new Point(0, line1.getConstant());
    }

    if (line1.getSlope() == line2.getSlope()) {
        throw new IllegalArgumentException("slopes are same, the lines do not intersect.");
    }

    int x = (line2.getConstant() - line1.getConstant()) / (line1.getSlope() - line2.getSlope());
    int y = line1.getSlope() * x + line1.getConstant();

    return new Point(x, y);
}
Run Code Online (Sandbox Code Playgroud)

问题是抛出非法争论异常是正确的事情吗?由于输入有效,它并不能完全说服我.

自定义异常是正确的做法吗?听起来是一个不错的选择,但额外的意见会有所帮助.

谢谢

Ste*_*n C 37

问题是抛出非法论证异常是正确的事情吗?

这取决于你想要/需要"框架"这种情况的方式; 即它是一个错误,一个用户输入错误,或该程序应该能够处理的东西?

  • 如果两条线没有交叉的情况明确地是一个"错误",那么就没问题了IllegalArgumentException.这就是异常的目的.(请注意,它是一个未经检查的异常,因此期望它不会被捕获/恢复.)

  • 如果您希望程序能够自行恢复,那么自定义异常是最好的选择.这样,你减少了你的代码混淆的可能性(例如)一个库方法抛出(比方说)IllegalArgumentException...而不是"两条线相交"之外的东西.

  • 如果这种情况是您希望作为输入验证的一部分向最终用户报告的,那么通用的"验证错误"异常可能比特定的自定义异常更合适.但是,此方法看起来并不像(仅)用于用户输入验证.


And*_*wry 5

这几乎肯定不应该引发异常,因为使用任意两个Line值调用这样的方法是完全有意义的。您已经正确处理了空值。

您还非常合理地定义了您的类在一种不明确的输入情况下的行为,即两条重合的“常量”(水平)线,您返回x=0该线上的点。您应该类似地为其他不明确输入的情况选择返回值:重合垂直线、既不是水平也不是垂直的重合线以及非重合平行线。

在我看来,最后一种情况(不重合的平行线)最自然的结果是null,反映了没有交点的事实。

然后由客户端决定空交集是否会导致异常、错误消息或其他任何情况。例如,提示用户相交线的交互式 shell 可能会打印一条错误消息并要求用户重试。IllegalArgumentException如果引起平行线的约束相互矛盾,则可能会抛出一些更复杂的计算,例如尝试定义其搜索边界的线性优化器。

当然,所有这些情况下的返回值(重合线或非重合平行线)都应该精确记录在方法的 javadoc 中。