尝试/捕捉和循环控制

时间:2011-03-30 19:31:56

标签: java try-catch

我对这个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;
        }
    }

这应该如何工作:horizo​​ntal []和vertical []是两个int [] s,每个int [] s保存国际象棋骑士可能移动的值,即2个水平和1个垂直输出将是一个移动。然后它应该为“square”分配一个非零的movenumber。 try / catch位应该捕获任何移出板,增加x,然后再次通过循环。但无论什么时候通过声明它都不会再次通过第一个;相反,它转到第二个if并生成异常。我不确定哪种语句会以这种方式返回控制权。

2 个答案:

答案 0 :(得分:4)

您写道:

  

try / catch位应该抓住任何一个   移出董事会,增加x,   然后再次循环。

不,不应该。您似乎在考虑一个异常处理程序(“catch bit”),好像它是一个在发生异常时调用的方法,它会将控制权返回到调用它的位置。这不是他们的工作方式。

当代码中出现ArrayIndexOutOfBoundsException时,控件会跳转到异常处理程序。 try块内代码的所有处理都将终止 - 它不会被恢复。执行catch块中的代码。如果x==8您的方法将返回一个值;但除此之外,您的异常处理程序只是增加x并结束。这意味着在catch块结束后会执行代码。你没有展示你的方法的其余部分 - 我认为必须有更多,因为它需要返回一个值 - 所以我不能确定接下来发生了什么,但这可能导致任何数量的问题。

异常处理在这里是不合适的。根据电路板的大小明确测试坐标。

答案 1 :(得分:1)

如果您希望在捕获体完成后重新进入循环,请将try catch移动到循环内。

但实际上,请听听每个说你不应该使用例外情况的人。