2011-03-30 4 views
0

나는이 일을해야하는 방법이 시도/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 개가 하나의 이동이됩니다. 그런 다음 "제곱"에 0이 아닌 movenumber를 지정해야합니다. try/catch 비트는 보드 밖으로 이동을 잡아서 x를 증가시킨 다음 루프를 다시 통과해야합니다. 그러나 그것이 성명서를 통과 할 때마다 그것은 다시 처음이라면 통과하지 못한다. 대신 두 번째 if로 이동하여 예외를 생성합니다. 나는 어떤 명령문이 그런 식으로 통제권을 되돌릴 지 확신하지 못한다.

+9

미래의 설계를 위해서, 당신은 정상적인 프로그램 로직의 일부로 예외를 사용해서는 안됩니다. –

+2

+1 Chris. @Alex, 예외가 발생하지 않는 방식으로 코드를 구조화하려고합니다. 그들은 EXCEPTions이지, EXPECT는 아닙니다. :-) – corsiKa

+1

try-catch 예외 처리를 흐름 제어 구조로 사용하지 마십시오. 예외 처리만을위한 것입니다. IMHO 이것은 가난한 Java 코드입니다. – PeterMmm

답변

1

catch 본체가 완료된 후 루프를 다시 시작하려면 try catch를 루프 내부로 이동하십시오.

하지만 실제로 예외를 사용해서는 안되는 모든 사람의 말을 들어주세요.

+0

그가 잡으려고하는 예외가 루프의 본문이 아닌 루프 조건에 의해 생성되기 때문에 루프 내부로 이동하면 아무래도 도움이되지 않습니다. –

+0

@Dave Costa, 좋은 지적. 루프의 일부 구조 조정이 필요합니다. –

4

당신이 쓴 :

은 try/캐치 비트 보드, 증가 X, 에서 어떤 움직임을 잡아 다시 루프를 통해 가야한다.

아니요. 예외가 발생했을 때 호출되는 메소드 인 것처럼 예외 처리기 ("catch bit")를 생각하는 것처럼 보입니다. 예외가 발생하면 호출 된 곳으로 제어가 되돌아갑니다. 그건 그들이 일하는 방식이 아닙니다.

코드에서 ArrayIndexOutOfBoundsException이 발생하면 컨트롤이 예외 처리기로 점프합니다. try 블록 내의 모든 코드 처리가 종료됩니다. 다시 시작하지 않습니다. catch 블록 내의 코드가 실행됩니다. x==8 메서드가 값을 반환하면; 그렇지 않으면 예외 처리기가 x를 증가시키고 종료합니다. 즉, 코드 실행은 catch 블록이 끝난 후에 실행됩니다. 나머지 메소드를 표시하지 않았습니다. 값을 반환해야하기 때문에 더 많은 것이 있어야한다고 생각합니다. 그래서 다음에 어떤 일이 발생하는지 확실히 말할 수는 없지만, 여러 가지 문제가 발생할 수 있습니다.

여기서 예외 처리는 단순히 부적절합니다. 보드의 크기에 대한 좌표를 명시 적으로 테스트하십시오.

+0

아, 감사합니다. –