我应该使用“尝试/捕获”功能吗?

时间:2019-10-14 17:23:04

标签: java multidimensional-array try-catch

我正在做一些练习问题,而当前正在解决的问题涉及不断检查2D数组中的周围值。

我想知道处理此类问题的最佳方法是out of bounds exceptions。我应该为每个要检查的索引使用try-catch块吗?在这种情况下,将不会使用catch部分,因为如果发生错误,我将不打印任何内容或结束程序。这就是为什么我认为可能有更好的方法来解决这个问题。

这是“索引检查”的一些简化代码

private static void findRoute(String[][] area, int currentRow, int currentCol) {
    int row = currentRow;
    int col = currentCol;

    while(!area[row][col].equals("D")) {
        try {
            checkRight(area, row, col);
        } catch(IndexOutOfBoundsException io) {
            //Move on
        }


        try {
            checkLeft(area, row, col);
        } catch(IndexOutOfBoundsException io) {
            //Move on
        }
    }
}

例如,如果第一个try-catch block导致错误,我希望它移至下一个try-catch来检查下一个值。

但是,如果没有错误,我想检查使用try-catch块所在的索引处的值。但是,如果我在try-catch之后放置一个语句以获取checkRight()的值,并且抛出了try-catch中的错误,那么这只会给我一个错误,程序将崩溃。 / p>

我应该以其他方式来处理吗?有没有更简单的方法可以使用if-statements或其他方法来处理此问题?

2 个答案:

答案 0 :(得分:0)

通常,例外是不遵守规则的事情。您期望某些东西,并且大多数情况下它们应该满足您的期望,但是在某些特殊情况下,您的期望得不到满足。如果您仔细考虑一下,您将会意识到,由于软件可以具有不同的级别,因此较低级别的例外不一定是较高级别的例外,反之亦然。

您在组织代码时犯的主要错误是,对索引范围的关注是在findRoute级别而不是在其适当级别(即,在checkLeft和{{ 1}}方法。在checkRight级别上,您可能期望(从字面上看)有一些边缘情况,但是在findRoutecheckLeft级别上,您需要处理此问题。结果,您应该将对边界的所有关注转移到checkRightcheckLeft中。如果您认为超出范围的处理价值是记录或其他目的的例外,则可以尝试使用这些方法,但是应确保它们能够处理。例如,您可以将这些方法修改为checkRight,并在boolean的结尾处返回true,在try的结尾处返回false,{{ 1}}

catch

然后您可以执行以下操作:

checkRight(区域,行,列)|| checkLeft(area,row,col);

不用担心:如果liketry { //Do some stuff return true; } catch (Exception e) { //Do some stuff return false; } ,则不会调用checkRight

答案 1 :(得分:0)

您可以使用 if 语句代替 try-catch 结构,因为它成本更低

private static void findRoute(String[][] area, int row, int col) {
    // index checking
    if (row < area.length && col < area[row].length) {
        // do some stuff
    } else {
        // do another stuff
    }
}