【问题标题】:Java: Alternative to handling a strange error/return type with exceptionsJava:处理带有异常的奇怪错误/返回类型的替代方法
【发布时间】:2011-11-11 01:19:07
【问题描述】:

我有一个函数作为矩形类的一部分(其中的点是不可变的双精度数,因此矩形也是不可变的),我需要提供一种计算与另一个矩形的交点的方法。该方法将返回计算出的相交矩形。但是,如果对象根本不相交,则会引发异常。

我能想到的抛出异常的唯一替代方法是返回一个称为 RectIntersection 的特殊类型,调用者可以轮询该对象以查看交集计算是否失败。比起抛出异常,我更喜欢这样,但它让我需要测试对这个函数的每次调用以检查新创建的对象。

对于处理这种情况还有其他建议吗?

static public DoubleRect calcRectIntersection(DoubleRect r1, DoubleRect r2) throws DoubleRectException {

    if((r1.topLeft.x > r2.bottomRight.x || r1.bottomRight.x < r2.topLeft.x || r1.topLeft.y > r2.bottomRight.y || r1.bottomRight.y < r2.topLeft.y) != true)
    {
        return new DoubleRect(r1.topLeft.x >= r2.topLeft.x ? r1.topLeft.x : r2.topLeft.x,
                r1.topLeft.y >= r2.topLeft.y ? r1.topLeft.y : r2.topLeft.y,
                r1.bottomRight.x <= r2.bottomRight.x ? r1.bottomRight.x : r2.bottomRight.x,
                r1.bottomRight.y <= r2.bottomRight.y ? r1.bottomRight.y : r2.bottomRight.y);
    }
    else throw new DoubleRectException("Call to calcRectIntersection() could not complete since the two rectangles did not intersect");
}

【问题讨论】:

  • 您不应该对正常控制流使用异常。两个不相交的矩形对我来说听起来像是正常的控制流。为什么不返回一个大小为零的矩形?
  • 作为参考,if ((humongously long condition) != true) 的可读性非常糟糕。推荐if (!(humoungously long condition)),或者更好的是if (logical inversion of humongously long condition)
  • @cHao 说的:if (condition != true) 也和if (!condition) 一样。
  • 我从 C 移植这个。原来是 !condition。 Java 似乎不喜欢原来的语法。
  • 并考虑使用 max 函数来处理大量三元组。

标签: java exception-handling error-handling


【解决方案1】:

为什么不直接返回null?您只需在使用它之前检查以确保返回值不为空。

或者,正如 Oli 所说,返回一个空矩形。可以说,这就是两个不重叠矩形的交集。您甚至可能不需要修改使用它的代码(很容易预见在给定一个空矩形的情况下什么都不做的代码),或者您可以添加一个 isEmpty 方法来检查结果。这是有先例的,在Rectangle class

你说得对,异常并不是真正用于非异常情况的工具。

【讨论】:

  • +1 - 确保将适当的 cmets 添加到您的方法中,表明返回值 null 表示矩形不相交。这样一来,所有使用此方法的人都应该明白。
  • 你是对的。可以说这就是两个不重叠矩形的交集
  • 没错,但这是我试图避免的,所以我可以在必要时使用 object.method().method().method()。抛出异常使其安全,但我想我需要找出另一种方法。
  • 首先,这不是很棒的编码风格。你会经常发现你需要对中间值做一些事情,但是你已经失去了它们——所以无论如何你都需要回去改变它。其次,不一定。您的其他方法可能适用于空矩形,具体取决于。
  • 您应该看到用于计算角度的 DoublePoint 代码。将少量计算重构为他们自己的方法会使其更具可读性,但它会使该方法几乎慢一倍。我真的不介意乱码,因为这些课程不属于公共领域;仅适用于我的应用程序。
猜你喜欢
  • 2019-04-10
  • 2017-02-27
  • 2016-10-27
  • 2021-12-20
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多