【问题标题】:Removing try/catch exception删除 try/catch 异常
【发布时间】:2013-03-09 18:09:06
【问题描述】:

我正在开发一个数独求解器,而求解方法给出了一个错误,我已经通过 try and 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++。当y > 8 时,程序应该完成,因为所有 81 (9x9) 个单元格都已填满。

我正在考虑将 try/catch 方法更改为一个简单的方法

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

但这也给了我一堆错误。

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

【问题讨论】:

  • 什么是抛出越界异常(我没有看到任何数组访问正在进行)?
  • 是否可以通过更改您提出的if 条件来使其工作,使用||而是 &&?

标签: java exception try-catch sudoku


【解决方案1】:

我会在方法的开头添加这个检查:

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

如果您在任一方向都超出了拼图板的范围,则显然您还没有找到解决方案,因此您返回 false。您可以在此检查之后计算 nexti 和 nextj,因为下一个递归调用将处理它们超出范围的情况。

您可能会说“好吧,我的 nextj 计算使用模数,所以它永远不会超出范围。”确实如此,但您也不能保证将使用正确的参数调用该方法,因此值得检查。

【讨论】:

    【解决方案2】:

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

    添加

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

    在您的方法开始时应该可以解决问题(如果您确定在 j

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 1970-01-01
      • 2011-04-01
      • 2015-06-21
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多