2013-03-20 117 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計算使用模數,所以它永遠不會出界」。這是真的,但你也不能保證該方法將被調用正確的參數,所以它值得檢查。