我正在做一些练习问题,而当前正在解决的问题涉及不断检查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
或其他方法来处理此问题?
答案 0 :(得分:0)
通常,例外是不遵守规则的事情。您期望某些东西,并且大多数情况下它们应该满足您的期望,但是在某些特殊情况下,您的期望得不到满足。如果您仔细考虑一下,您将会意识到,由于软件可以具有不同的级别,因此较低级别的例外不一定是较高级别的例外,反之亦然。
您在组织代码时犯的主要错误是,对索引范围的关注是在findRoute
级别而不是在其适当级别(即,在checkLeft
和{{ 1}}方法。在checkRight
级别上,您可能期望(从字面上看)有一些边缘情况,但是在findRoute
和checkLeft
级别上,您需要处理此问题。结果,您应该将对边界的所有关注转移到checkRight
和checkLeft
中。如果您认为超出范围的处理价值是记录或其他目的的例外,则可以尝试使用这些方法,但是应确保它们能够处理。例如,您可以将这些方法修改为checkRight
,并在boolean
的结尾处返回true
,在try
的结尾处返回false
,{{ 1}}
catch
然后您可以执行以下操作:
checkRight(区域,行,列)|| checkLeft(area,row,col);
不用担心:如果like
是try {
//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
}
}