如何在不抛出异常的情况下执行此操作?

时间:2013-10-22 12:14:05

标签: java exception-handling

我对Java很新,我试图了解异常以及何时应该使用它们。我一直在使用它们作为错误检查的一种形式,但我遇到过几个人说异常应该仅用于程序控制之外的事情,例如用户错误。

我有一个函数,对于2维的给定行,计算xMin和xMax之间的所有y值。如果直线是垂直的,则此函数会抛出异常,因为无法计算垂直线上y的所有值。在两个y值之间存在等效函数查找点,如果该行是水平的,则会抛出错误。

findPointsInRangeOfX (int xMin, int xMax) throws LineIsVerticalException {
    // check if line is vertical
    // if vertical, throw an exception
    // else calculate the y values for each integer between xMin and xMax
    // return y values
}

我将此函数称为查找给定窗口中某一行上所有点的一部分,由最小和最大x和y值给出。我不检查此功能中的线是否垂直;相反,我依靠findPointsInRangeOfX中的检查并在方法周围使用try和catch块。

pointsInWindow (int xMin, int xMax, int yMin, int yMax) {
    try {
        // Find list of all the points between xMin and xMax.
        // Remove from list all points not between yMin and yMax
    }
    catch (LineIsVerticalException e) {
        // If line is vertical, cannot find points between xMin and xMax
        try {
            // Instead, find list of all points between yMin and yMax
            // Remove from list all points not between xMin and xMax
        }
        catch (LineIsHorizontalException e) {
            // This part will never be reached because the line is vertical
            // But the compiler complains if the exception isn't caught
        }
    }
}

这可以吗?我不是因为错误而抛出异常 - 有一条垂直线没有错 - 但是我用它告诉pointsInWindow它需要找到y值而不是x值之间的点。我是否应该重复检查以查看pointsInWindow函数中的行是否是垂直的而不是使用try catch块?如果我确实复制了检查,我是否应该一起摆脱LineIsVerticalException?

4 个答案:

答案 0 :(得分:6)

你必须遵守单一责任原则:每种方法都做一件事。 现在你的方法做两件事:检查它是否是垂直/水平并计算一些东西。

此处另一个注意事项:不要对程序流使用异常。

你应该把它分成这样的东西:

bool isVertical(parameters){}
bool isHorizontal(parameters){}
SomeClass CalculateVertical(parameters){}
SomeClass CalculateHorizontal(parameters){}

您的程序流程可能如下所示:

if(isVertical(something)){
 CalculateVertical(something);
else if (isHorizontal(something)){
 CalculateHorizontal(something);
}

示例实施:

SomeClass CalculateVertical(something){
 if(!isVertical(something)) { throw new IllegalArgumentException() }
 // Calculations
}

请注意,程序员不必捕获此异常。

答案 1 :(得分:1)

或者你可以修改如下:

pointsInWindow (int xMin, int xMax, int yMin, int yMax) {
    try {
        // Find list of all the points between xMin and xMax.
        // Remove from list all points not between yMin and yMax
    }
    catch (LineIsVerticalException e) {
        // If line is vertical, cannot find points between xMin and xMax
        // do something..
        }
    catch (LineIsHorizontalException e) {
        // unless LineIsVerticalException is superclass of LineIsHorizontalException,
        // this will work 
        // do something ..
        }
    }
}

答案 2 :(得分:1)

一般情况下,我尝试使用Exceptions来解决意外问题(例如网络故障),而不仅仅是边界情况。然而,这是一个模糊的区别,取决于您的具体应用程序上下文。

专门针对您的问题。分割功能怎么样?制作两个函数来检测给定的行是水平的还是垂直的(例如boolean isVertical());.

在您的pointsInWindow函数中,您可以先检查是否正在处理垂直/水平线的特殊情况,如果不进一步调用findPointsInRange方法。

尝试永远不要复制逻辑,因为这违反了DRY原则DRY principle,并且在维护代码时往往会进一步导致问题。

希望这有帮助, 马库斯

答案 3 :(得分:-1)

findPointsInRangeOfX (int xMin, int xMax) throws LineIsVerticalException {
    if(isLineVeritical(xMin, xMax)){
        throw new LineIsVerticalException();
    }

    return calculateValuesBetweenMinAndMax(xMin, xMax);
}