2011-03-30 90 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