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...而不是"两条线相交"之外的东西.
如果这种情况是您希望作为输入验证的一部分向最终用户报告的,那么通用的"验证错误"异常可能比特定的自定义异常更合适.但是,此方法看起来并不像(仅)用于用户输入验证.
这几乎肯定不应该引发异常,因为使用任意两个Line值调用这样的方法是完全有意义的。您已经正确处理了空值。
您还非常合理地定义了您的类在一种不明确的输入情况下的行为,即两条重合的“常量”(水平)线,您返回x=0该线上的点。您应该类似地为其他不明确输入的情况选择返回值:重合垂直线、既不是水平也不是垂直的重合线以及非重合平行线。
在我看来,最后一种情况(不重合的平行线)最自然的结果是null,反映了没有交点的事实。
然后由客户端决定空交集是否会导致异常、错误消息或其他任何情况。例如,提示用户相交线的交互式 shell 可能会打印一条错误消息并要求用户重试。IllegalArgumentException如果引起平行线的约束相互矛盾,则可能会抛出一些更复杂的计算,例如尝试定义其搜索边界的线性优化器。
当然,所有这些情况下的返回值(重合线或非重合平行线)都应该精确记录在方法的 javadoc 中。
| 归档时间: |
|
| 查看次数: |
74297 次 |
| 最近记录: |