2013-03-20 2 views
0

Я работаю над решателем sudoku, и метод solve дает ошибку, которую я временно «решил» с исключением try и catch.Удаление исключения try/catch

Однако, я немного обеспокоен тем, что я одеваю ArrayIndexOutOfBoundsException. Я просто хочу исправить ошибку, а не скрывать ее в исключении try/catch.

Это то, что попытка/улов выглядит следующим образом:

try { 
     if (puzzle.getNum(i, j) != puzzle.blank) 
      return solve(nexti, nextj); 
    } catch (ArrayIndexOutOfBoundsException e) { 
     return true; 
    } 

Я думаю, что с тех пор я уже получил информацию, когда x > 8 пришло время изменить строку, что приводит к y++. А когда y > 8, программа должна быть выполнена, поскольку все ячейки 81 (9x9) заполнены.

Я думаю вокруг линий изменения методы попробовать/поймать для простого

if((i > 8) && (j > 8)){ 
     return true; 
} 

, но это дает мне кучу ошибок, а также.

Я уверен, что исправление очень просто, но концептуально важно.

+0

что бросает исключение из-за пределов (я не вижу доступа к массиву)? – Daedalus

+0

- это номер строки? – ITroubs

+0

Возможно ли это сделать, изменив условие 'if', которое вы предложили, используя || вместо &&? – jmrodrigg

ответ

0

Поскольку вы используете рекурсивный метод, вы должны иметь в качестве первой строки кода «конечное условие».

Добавление

if((i > 8) && (j > 8)){ 
     return true; 
} 

В начале вашего метода следует сделать трюк (если вы уверены, что вы никогда не рассылают я = 9 при J < 8). Какие другие ошибки вы получили, когда делаете это?

1

Я хотел бы добавить эту проверку в начале метода:

if(i >= puzzle.puzzleSize || j >= puzzle.puzzleSize) 
{ 
    return false; 
} 

Если вы за пределы доски головоломки в любом направлении, вы явно не нашли решение, таким образом, вы возвращаете ложный. Ваши вычисления nexti и nextj могут быть после этой проверки, потому что следующий рекурсивный вызов будет обрабатывать случай, когда они становятся вне границ.

Возможно, у вас может возникнуть соблазн сказать: «Ну, моя следующая оценка использует модуль, поэтому он никогда не будет за пределами границ». Это правда, но вы также не можете гарантировать, что метод будет вызван с правильными параметрами, поэтому стоит проверить.