Java 尝试/捕捉和循环控制

Java 尝试/捕捉和循环控制,java,try-catch,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) { //

我对这个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;
        }
    }
这应该如何工作:水平[]和垂直[]是两个int[]s,每个int[]s保存一个国际象棋骑士可能的移动值,即2个水平和1个垂直向外将是一个移动。然后,它应该为“平方”指定一个非零的数字。
try/catch位应该捕捉板外的任何移动,增加x,然后再次通过循环。但无论何时,只要它通过声明,它就不会再通过第一个if;相反,它转到第二个if并生成异常。我不确定哪个语句会以这种方式返回控制

如果您希望尝试捕捉在捕捉主体完成后重新进入循环,请将其移动到循环内


但实际上,请听每个人说,你不应该为此使用异常。

如果你想让try catch在catch body完成后重新进入循环,请将其移动到循环中

但实际上,请听每个人说,你不应该为此使用异常。

你写道:

try/catch位应该可以捕获任何 移出电路板,增量x, 然后再进行一次循环

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

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

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

您写道:

try/catch位应该可以捕获任何 移出电路板,增量x, 然后再进行一次循环

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

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


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

仅用于将来的设计,不应将异常作为正常程序逻辑的一部分。+1克里斯@Alex,您希望以一种不会发生异常的方式构造代码。它们是例外,不是期望值。:-)永远不要使用try-catch异常处理作为流控制结构。它仅用于异常处理。这是糟糕的Java代码。同意w/@Chris,控制流的异常是糟糕的。另外,这是一个很好的问题,我试图粘贴上面的代码以开始一些建议的更改,但不得不捆绑太多的东西并失去了兴趣。谢谢大家,我会这样做的,Java新手,所以非常感谢所有这些帮助。感谢您的尝试(andersoj;)只是为了将来的设计,您不应该将异常作为正常程序逻辑的一部分@Alex,您希望以一种不会发生异常的方式构造代码。它们是例外,不是期望值。:-)永远不要使用try-catch异常处理作为流控制结构。它仅用于异常处理。这是糟糕的Java代码。同意w/@Chris,控制流的异常是糟糕的。另外,这是一个很好的问题,我试图粘贴上面的代码以开始一些建议的更改,但不得不捆绑太多的东西并失去了兴趣。谢谢大家,我会这样做的,Java新手,所以非常感谢所有这些帮助。感谢您的尝试(andersoj;)在循环中移动它也不会有任何帮助,因为他试图捕获的异常是由循环条件生成的,而不是由循环体生成的。@Dave Costa,说得好。需要对循环进行一些重新构造。无论如何,将其移动到循环中都不会有帮助,因为他试图捕获的异常是由循环条件生成的,而不是由循环体生成的。@Dave Costa,说得好。需要对循环进行一些重构。