2011-06-02 41 views
0

這裏只是一小段Java代碼..但是得到一個OutOfBoundsException,我不太清楚爲什麼?任何幫助將是偉大的!IndexOutOfBoundsException

之前有人問這是否是功課,不是它是考試準備。

import java.util.Scanner; 
public class exampractice { 

    public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 

     int[] a = {1,2,3}; 
     int min = a[0]; 
     int max = a[0]; 

     for (int i = 0; i <= a.length; i++){ 
      if(a[i] < min) 
       min = a[i]; 
      else 
       if(a[i] > max) 
        max = a[i]; 
     } 

     System.out.println("Min is"+min+ "\nMax is: " + max); 
    } 
} 
+0

變化'<=''到<'。 – asgs 2011-06-02 19:08:38

+0

* FACEPALM * Cheers guys .. haha​​ – Jimmy 2011-06-02 19:10:22

+0

你做了一個「Off-by-one」錯誤。通常你應該檢查你的代碼邊緣情況。特別是總是檢查<和<= (and >,> =當然)。 – PeterT 2011-06-02 19:12:22

回答

1

它應該是<而不是<=。陣列上基於零的索引從0到length - 1不等。

更新

有人在讀研究生教我建立心理模式的集合,這樣並使用它們;你會避免錯誤。這一次是在一個類似C語言中的任何陣列總是被搜索作爲

for(index = 0; index < array.length ; index++) 

已經訓練自己在這個這些年來,我看到了這個bug的,從字面上來看,乍看之下,這是我在得到了在線的頭。

下面的是一些更多的例子,爲C:

char aString[MAXLENTH]; // declare a string array 
char * aString ; 
aString = (char *) malloc(MAXLENGTH]; // or malloc it 

// constructing a string with catenation 
aString[0] = '\0';  // now either way this is guaranteed an empty string 

但是,當然,我應該用另一種模式:

if((aString = (char *) malloc(MAXLENGTH) == NULL){ 
    // report out of memory 
    exit(BAD); 
} 

想想其他的模式可能是很好的。

0
for (int i = 0; i <= a.length; i++) 

應該是

for (int i = 0; i < a.length; i++) 
0

雖然是一個數組,數組是基於零的索引,則必須循環它從0到則爲a.length -1。這足以將i <= a.length更改爲i < a.length

for (int i = 0; i < a.length; i++) 
1

陣列,可以使用基於0票並在for循環你走我< =則爲a.length這意味着你可以使用一個不存在的元素。只要刪除=和你的好。

for (int i = 0; i < a.length; i++) 
0

我應該是0則爲a.length之間 - 1,因爲陣列的第一個元素與鍵0 開始所以爲條件應嚴格小於而不是小於或等於一個。長度。

0

您的迴路應< a.length和不<= a.length

for (int i = 0; i < a.length; i++) { 
+0

哇.. Im dumb哈哈。乾杯* facepalm * – Jimmy 2011-06-02 19:10:00