1

안녕하세요 좋은 사람들이 stackoverflow! 나는 이해할 수없는 이상한 문제가있다.배열 인덱스가 범위를 벗어 났습니까? 방법?

private static void resi(int [][] matrica,int row, int col) { 
    if (matrica[row][col] != 0) { 
     next(matrica,row, col); // <--- this the line that first throws the exception 
    } else { 
     for (int num = 1; num < 10; num++) { 
      if (checkRow(matrica,row, num) && checkColumn(matrica,col, num) && checkBox(matrica,row, col, num)) { 
       matrica2[row][col] = num; 
       matrica4[row][col] = num; 
       next(matrica,row, col); 
      } 
     } 
     matrica[row][col] = 0; 

    } 
} 

그리고 다른 하나 : 나는 문제가있다 내 두 가지 방법 포스트거야

private static void next(int [][] matrica2,int row, int col) { 
    if (col < 8) { 
     resi(matrica2,row, col + 1); 
    } else { 
     resi(matrica2,row + 1, 0); 
    } 
} 

을 그래서, 내가 온라인으로 발견 된 일부 코드를 기반으로 스도쿠 솔버를 만들고있어. 이제 프로그램을 디버깅하려고 할 때 선의 일부를 멋지게 처리 할 수 ​​있지만 (예상대로 작동 함) 일단 프로그램이 "resi"메서드에서 "next"메서드 호출에 도달하면 배열 인덱스와 충돌합니다 out of bounds 예외입니다. 디버깅하지 않고 프로그램을 실행하려고하면 동일한 메소드 호출에서 NetBeans의 출력 탭에 "배열 인덱스가 범위를 벗어남"예외가 반복적으로 발생합니다.

나는 그 오류의 원인을 알지 못합니다. 늘어나는만큼 알 수 있듯이, 행과 열은 0-8 범위를 넘지 않습니다 ... 2D 배열에 문제가 있습니까? 감사합니다.

편집 1 :

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9 
at SudokuGame.Main.resi(Main.java:88) 
    at SudokuGame.Main.next(Main.java:107) 
    at SudokuGame.Main.resi(Main.java:89) 
    at SudokuGame.Main.next(Main.java:105) 
    at SudokuGame.Main.resi(Main.java:95) 

... 그리고 예외를 던지는는 코드를 통해가는 것처럼 보인다 유지하기 때문에 그래서, 그들은 반복된다?

+0

당신은 우리에게 배열의 초기화를 게재 할 수 있습니까? –

+1

또한 예외가있는 정확한 행을 표시 할 수 있습니다. 나는 당신이 이것을하면 거의 즉각적인 해결책을 보장 할 수 있다고 생각합니다. 건배. –

+0

btw resi-method에서 matrica2와 matrica4는 무엇입니까? – JohnnyAW

답변

0

을 통보하지만, 페일 세이프 (fail-safe) 인덱스로 row 행 검사에서 더이 col 거기에있다, 그래서 거기 row 그래서보다 큰 값으로 8 예 (9)

를 초과 할 것이라는 점을 보장 row 미만 8 또는하지 (row+1) 증가 전의 경우는 라인 resi(matrica2,row + 1, 0);에 반드시 확인되지 않습니다.

private static void next(int [][] matrica2,int row, int col) { 
if (col 8) { 
    resi(matrica2,row, col + 1); 
} else if(row < 8) { // Make sure to increment row only if less than 8 
    resi(matrica2,row + 1, 0); 
} else { 
    // Stop the application (May Be) 
} 

은}

+0

나는 당신이 뭔가있는 것 같아. 방금 솔버가 해결하지 못하게하는 방법이 없다는 것을 알아 챘습니다. 결국, 8 위에 "행"을 가져 오게됩니다. 나는 그것을 고치려고 할 것이고, 여기에 게시 할 것입니다. – elemmiki

+0

해결사를 중단하기위한 논리가 작동하는지 확인하십시오. – TheKojuEffect

+0

글쎄, 이제 예외 상황이 멈추었습니다.어느 것이 좋니. 그러나이 프로그램은 지금 무한정 실행 중입니다. 나는 matrica4를 출력해야하는 줄을 썼다. 다시 디버깅을 시도하면 첫 번째 "다음"호출에 도달하고 F8 키를 누르면 F8을 사용할 수 없게됩니다. 중단 할 수없는 작업을 수행하기 때문에 F8을 사용할 수 없게됩니다. – elemmiki

0

실행은 문제가 발생한 행을 정확히 나타냅니다. 코드를 살펴보면 next 호출 후 resi 메서드의 세 번째 줄 (next(matrica,row, col);)은 행의 유효성 검사를 일부 수행하지 못하기 때문에 실행을 중단합니다. 우리가 확인하기 위해, pastebin.com 같은 일부 사이트에서 execption를 붙여없고, 당신이 row를 증가 된 next()에서) = 우리가 그것을 보려면 여기를