2013-03-20 53 views
0

我正在研究一个数独求解器,并且solve-method给出了一个错误,我暂时用一个try和catch异常“解决了”。删除try/catch异常

但是,我有点担心,我正在抓住ArrayIndexOutOfBoundsException。我只想修复错误,而不是将其隐藏在try/catch异常中。

这是try/catch语句的样子:

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

我在想,既然我已经得到的信息时x > 8是时候改变行,从而导致y++。当所有81个(9x9)单元格都被填满时,应该完成该程序。

我想围绕改变的try/catch方法简单

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

的线,但是这给了我一堆错误也是如此。

我确定修复非常简单,但在概念上很重要。

+0

什么是抛出界外例外(我没有看到任何数组访问继续)? – Daedalus 2013-03-20 14:58:57

+0

是我的行数? – ITroubs 2013-03-20 14:59:47

+0

可以通过改变你提出的if条件来使它工作吗?而不是&&? – jmrodrigg 2013-03-20 15:01:27

回答

0

由于您正在使用递归方法,因此您应该将第一行代码作为“结束条件”。

添加

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

在你的方法应该做的伎俩的开始(如果你确信你从来没有送我= 9当j < 8)。这样做时你得到的其他错误是什么?

1

我将在方法的开头添加此检查:

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

如果你出在任一方向的拼图板的界限,显然你还没有找到一个解决方案,从而返回假。你的nexti和nextj的计算可以在这次检查之后进行,因为下一次递归调用将会处理超出边界的情况。

你可能会说“好吧,我的nextj计算使用模数,所以它永远不会出界”。这是真的,但你也不能保证该方法将被调用正确的参数,所以它值得检查。