2011-03-30 67 views
0

我很困惑这个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; 
     } 
    } 

应如何工作的:水平[]和垂直[]是两个int []里每个持有价值国际象棋骑士可能的举动,即2水平和1垂直是一举。然后它应该给“广场”分配一个非零的莫文字。 try/catch位应该抓住任何移出的棋盘,增加x,然后再次通过循环。但是,只要它通过声明,它不会再经历第一次;相反,它会转到第二个if并产生一个异常。我不确定哪种说法会以这种方式返回控制权。

+9

只是为了将来的设计,您不应该将异常用作正常程序逻辑的一部分。 – 2011-03-30 19:35:32

+2

+1 Chris。 @Alex,你想以这样一种方式来构建你的代码,即不会发生异常。他们是EXCEPT,而不是期望。 :-) – corsiKa 2011-03-30 19:37:48

+1

永远不要使用try-catch异常处理作为流程控制结构。仅用于异常处理。恕我直言,这是糟糕的Java代码。 – PeterMmm 2011-03-30 19:38:54

回答

1

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

但是,真的,倾听大家谁说你不应该使用例外。

+0

将它移入循环内部无论如何不会有帮助,因为他试图捕获的异常是由循环条件生成的,而不是由循环体生成的。 – 2011-03-30 19:51:53

+0

@Dave Costa,好点。循环的一些重构是必需的。 – 2011-03-30 20:20:02

4

您写道:

的的try/catch位应该抓住任何 移出板,增量X, ,然后再次通过循环。

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

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

异常处理在这里根本就不合适。明确地根据板的大小测试你的坐标。

+0

哦,我明白了,谢谢 – 2011-03-30 20:09:19