我对这个try / catch语句感到困惑
public int MakeMove() {
int x = 0; //counter for moves
try {
// tests to see if potential move has been reached
if (board[currentRow + (vertical[x])][currentColumn + (horizontal[x])] != 0) {
// increments x until a good move is reached.
while ((board[currentRow + (vertical[x])][currentColumn + (horizontal[x])] != 0)) {
x++;
if (x == 8) { //breaks if all moves are tried
return 1;
}
}
}
}
//should catch any tries to move piece off board, catches the exception and increments x
catch(ArrayIndexOutOfBoundsException e) {
x++;
if(x == 8) {//breaks if all moves are tried
return 1;
}
}
这应该如何工作:horizontal []和vertical []是两个int [] s,每个int [] s保存国际象棋骑士可能移动的值,即2个水平和1个垂直输出将是一个移动。然后它应该为“square”分配一个非零的movenumber。 try / catch位应该捕获任何移出板,增加x,然后再次通过循环。但无论什么时候通过声明它都不会再次通过第一个;相反,它转到第二个if并生成异常。我不确定哪种语句会以这种方式返回控制权。
答案 0 :(得分:4)
您写道:
try / catch位应该抓住任何一个 移出董事会,增加x, 然后再次循环。
不,不应该。您似乎在考虑一个异常处理程序(“catch bit”),好像它是一个在发生异常时调用的方法,它会将控制权返回到调用它的位置。这不是他们的工作方式。
当代码中出现ArrayIndexOutOfBoundsException
时,控件会跳转到异常处理程序。 try
块内代码的所有处理都将终止 - 它不会被恢复。执行catch
块中的代码。如果x==8
您的方法将返回一个值;但除此之外,您的异常处理程序只是增加x并结束。这意味着在catch
块结束后会执行代码。你没有展示你的方法的其余部分 - 我认为必须有更多,因为它需要返回一个值 - 所以我不能确定接下来发生了什么,但这可能导致任何数量的问题。
异常处理在这里是不合适的。根据电路板的大小明确测试坐标。
答案 1 :(得分:1)
如果您希望在捕获体完成后重新进入循环,请将try catch移动到循环内。
但实际上,请听听每个说你不应该使用例外情况的人。