Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于从客户端角度有效的无效输入,要引发哪个异常_Java_Exception Handling - Fatal编程技术网

Java 对于从客户端角度有效的无效输入,要引发哪个异常

Java 对于从客户端角度有效的无效输入,要引发哪个异常,java,exception-handling,Java,Exception Handling,我正在写代码来寻找两条线的交点。 当直线的斜率相等时,它们不相交。但另一方面,斜率相等的输入是完全有效的 public static Point calculateIntersection(Line line1, Line line2) { if (line1 == null || line2 == null) { throw new NullPointerException(" some message "); } if (line1.getCons

我正在写代码来寻找两条线的交点。 当直线的斜率相等时,它们不相交。但另一方面,斜率相等的输入是完全有效的

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);
}
问题是抛出非法论点例外是正确的做法吗? 因为输入是有效的,所以它不能完全说服我

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


谢谢

异常应该用于捕获程序流中的错误(“内部发生的情况”),而不是用于输入验证。我根本不会抛出异常。
想想看,这不是“例外”的意思,因为用户输入两条斜率相等的直线是完全正常的。

我认为你做的是正确的:你很早就发现了这种情况。要么是这样,要么人们会抱怨“你的程序有缺陷,看看这个输入数据,除以0”

鉴于在99%以上的情况下不会出现此类错误,这是一种例外情况,不允许声明已检查的异常,因此未检查的异常看起来确实是正确的选择

现在,至于
IllegalArgumentException
是否是“好的”,它至少是描述这种情况的最接近的例外。。。如果您觉得自己有一个更好的名称,您可以始终创建自己的名称,继承
RuntimeException

另一方面,如果这种情况并不罕见,那么可能应该检查达到该功能的逻辑,以便从一开始就不会出现这种情况

问题是抛出非法论点例外是正确的做法吗

这取决于您希望/需要如何“框定”该条件;i、 它是一个bug,一个用户输入错误,还是程序应该能够处理的东西

  • 如果两条线不相交的情况显然是一个“错误”,那么
    IllegalArgumentException
    就可以了。这就是异常设计的目的。(请注意,这是一个未经检查的异常,因此预期它不会被捕获/恢复。)

  • 如果您希望程序能够自行恢复,那么最好使用自定义异常。这样,您就减少了代码被(比如)库方法抛出(比如)一个
    IllegalArgumentException
    而混淆的可能性。。。而不是“两条线相交”的意思

  • 如果您希望将此情况作为输入验证的一部分报告给最终用户,那么一般的“验证错误”异常可能比特定的自定义异常更合适。然而,这个方法看起来不像是专门为用户输入验证而设计的


在某些上下文中,最好根本不抛出异常,但(IMO)这不是这些上下文之一。替代方法是返回
null
或向调用代码返回一个
值,该值表示“没有这样的点”。替代方案的问题是:

  • 如果返回
    null
    则应用程序必须处理
    null
    案例。。。否则会有NPE
  • 没有任何自然的
    实例可以用来表示“不是点”

这并不是说你不能让这些替代方案发挥作用。只是在这种情况下,可能需要做更多的工作,而且可能不会有实际的回报。

这几乎肯定不会引发异常,因为用任何两个
值调用这样的方法是非常有意义的。您已经适当地处理了空值

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

在我看来,最后一种情况——非重合平行线——最自然的结果是
null
,反映出没有交点的事实

然后将由客户机决定空交叉点是否保证异常、错误消息或其他信息。例如,一个交互式shell提示用户线相交,可能会打印一条错误消息并要求用户重试。一些更复杂的计算,例如,线性优化器试图为其搜索定义边界,如果引起平行线的约束相互矛盾,可能会抛出
IllegalArgumentException


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

正如@Andy Lowry和@KamikazeCZ所说,这不应该是一个例外

该方法本身不应考虑客户是否希望直线始终相交;它只需要找出两条线的交点——这本来是不可能发生的

如果调用者返回一个指示无交叉的结果,那么该代码可以决定它是否是无效输入,因为最终用户收到了适当的警告,或者是他们可以处理的事情(可能通过重新提示),或者抛出一个定制的异常

那么,回到这个方法应该返回什么呢?某种类型的哨兵值,与集合库中的
indexOf
返回-1的方式相同。返回
null
是一个合理的哨兵。在Java 8中,您可以返回一个
可选的
,以帮助提醒