2014-03-25 66 views
0

我必須製作一個程序,使其看起來像這樣:無法找出ArrayIndexOutOfBoundsException:-1

| 8 | 1 | 6 |

| 3 | 5 | 7 |

| 4 | 9 | 2 |

它會在每回合放置一個增加的數字,其位置是一個方塊向上和一個方塊向右。 n是正方形的大小,並且必須是奇數。所以上面的例子中n是3.爲了處理數組的邊緣,有3條規則。

1)如果行= -1(放置越過陣列的頂部),則行= N-1,如果

2)COL = N(放置進入過去的陣列的右邊緣),那麼COL = 0

3)如果當前位置已經填滿,或者如果行= -1 & &山坳= n,則放置,而不是低於最後放置

我已經得出結論,規則3應該在規則1和2之前檢查。我編寫了我的程序來打印行和列,而不是將它們放入診斷數組中urposes。由於某種原因,我的規則3如果語句導致-1,超出了數組的邊界,導致「ArrayIndexOutOfBoundsException:-1」。有人看到我做錯了嗎?我有我的規則1 & 2註釋掉了,所以我很確定它不需要處理它們。

//finds how many numbers will be placed based on the 
//number of squares to be filled 
int simCount = n*n; 
int i; 
//for loop that keeps track of how many squares are filled 
for(i = 1; i<simCount; i++) { 
    r = r - 1; //moves the placement by row 
    c = c + 1; //moves the placement by col 
    if(square[r][c]>0 || (r==-1 && c==n)) { //rule 3 
     r = r+2; 
     c = c-1; 
     } 
    //if(r==-1)        //rule 1 
    // r=n-1; 
    //if(c==n)         //rule 2 
    // c=0; 

    System.out.println("r:"+r + "   c:"+c); 
} 

回答

3

交換你的測試順序(但這本身不足以解決問題;見下文):

if((r==-1 && c==n) || square[r][c]>0) 

在你貼的代碼,square[r][c]必須r==-1 && c==n前進行評估,因爲條件運算符操作數從左到右進行求值。因此,如果r==-1 && c==n爲真,則評估square[-1][n],因此是例外。

然而,條件表達式的評估,一旦結果被稱爲停止,因此,如果您交換順序,那麼它不會如果第一個條件爲真試圖評估square[r][c](如true || anythingtrue)。

JLS 15.24(關於條件-或):

在運行時,將左邊的操作數的表達首先計算...

如果所得到的值爲true,的值條件或表達式是真實的,右邊的操作數表達式是不被評估的。

如果左側操作數的值爲假,則計算右側表達式; ...

...右邊的操作數表達式有條件地被評估而不是總是。

但是,要小心。通過首先評估規則3,您仍然可能遇到r==-1c!=n的情況,在這種情況下,square[-1][c]將被評估,並且將引發異常。您可能仍然需要重新安排一下,才能完成這一切工作,例如:

if ((r==-1 && c==n) || (r!=-1 && c!=n && square[r][c]>0)) { 

哪個越來越難看。這可能是更清晰簡單地拆分規則3,用else正確:

if (r == -1 && c == n) { 
    // rule 3a 
} else if (r == -1) { 
    // rule 1 
} else if (c == n) { 
    // rule 2 
} else if (square[r][c] > 0) { 
    // rule 3b 
} 

當然,你總是可以通過利用%(模)返工你的算法(具有trick,使其環繞負數):

static int nmod (int a, int b) { 
    return ((a % b) + b) % b; 
} 

// then: 
for(i = 1; i<simCount; i++) { 
    r = nmod(r - 1, n); 
    c = nmod(c + 1, n); 
    if (square[r][c] > 0) { 
     r = nmod(r + 2, n); 
     c = nmod(c - 1, n); 
    } 
    ... 
} 
+0

我改成了這一點,並得到了同樣的事情:如果((R == - 1 &&ç== n)的平方|| [R] [C]> 0){ – brttwrd

+0

@brttwrd呀看到我附加的說明。 –

+1

好吧,現在它可以工作。出於某種原因,儘管規則2 c仍似乎達到n,但我認爲我可以從這裏解決。非常感謝你! – brttwrd

相關問題