2013-04-06 27 views
0

在Java中是新的,我想知道爲什麼我有例外,即使我得到了我需要的答案。下面是源代碼ArrayIndexOutOfBoundsException:遞歸排序中的-1

package habeeb; 

import java.util.*; 

public class Habeeb 
{ 
    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 
     int[] num = new int[30]; 
     int i, count = 0; 
     System.out.println("Enter the integers between 1 and 100"); 
     for (i = 1; i <= num.length; i++) 
     { 
      num[i] = input.nextInt(); 
      if (num[i] == 0) 
       break; 
      count++; 
     } 
     Sorting(num, i, count); 
    } 

    public static void Sorting(int[] sort, int a, int con) 
    { 
     int j, count = 0; 
     for (j = 1; j <= con; j++) 
     { 
      if (sort[a] == sort[j]) 
       count++; 
     } 
     System.out.println(sort[a] + " occurs " + count + " times"); 
     Sorting(sort, a - 1, con); 
    } 
} 

這裏是輸出

run: 
Enter the integers between 1 and 100 
1 
2 
3 
2 
2 
4 
5 
3 
6 
1 
0 
0 occurs 0 times 
1 occurs 2 times 
6 occurs 1 times 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
3 occurs 2 times 
5 occurs 1 times 
4 occurs 1 times 
2 occurs 3 times 
2 occurs 3 times 
3 occurs 2 times 
2 occurs 3 times 
1 occurs 2 times 
0 occurs 0 times 
at habeeb.Habeeb.Sorting(Habeeb.java:18) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.Sorting(Habeeb.java:21) 
at habeeb.Habeeb.main(Habeeb.java:14) 
Java Result: 1 
+0

我在您的文章中添加了格式,但縮進仍然搞砸 - 使其難以閱讀。錯誤在於你在代碼中的某處引用了sort [-1]。您是否嘗試過打印索引的值以查看發生的位置? – 2013-04-06 18:22:28

+0

那麼,您在第18行使用了habeeb.Habeeb.Sorting中的-1的數組索引。 – 2013-04-06 18:23:06

+0

可能是因爲您在== 0時執行了此行:'Sorting(sort,a-1,con);' – 2013-04-06 18:24:59

回答

1
public static void Sorting(int[] sort, int a, int con){ 
int j, count=0; 
for(j=1; j<=con; j++){ 
    if(sort[a]==sort[j]) 
    count++; 
}System.out.println(sort[a]+" occurs "+count+" times"); 
Sorting(sort, a-1, con); 

應該是:

public static void Sorting(int[] sort, int a, int con){ 
if(a<0)return; 
int j, count=0; 
for(j=1; j<=con; j++){ 
    if(sort[a]==sort[j]) 
    count++; 
}System.out.println(sort[a]+" occurs "+count+" times"); 
Sorting(sort, a-1, con); 
+1

如果你給一些解釋,而不是僅僅發佈一個代碼 – 2013-04-06 18:27:25

+0

好的好友。在某些時候,a will = 0.現在,當下一個遞歸調用被創建時,它將通過>> Sorting(sort,0-1,con); ...然後當sort [a]被評估 - 它將試圖獲得數組元素'-1':) – 2013-04-06 18:35:36

+0

所以,如果(a <0)返回;是「終結者條件」 – 2013-04-06 18:38:12

1

的問題在這裏:

for (i = 1; i <= num.length; i++){ 
    num[i] = input.nextInt(); 

    if (num[i] == 0) 
     break; 

    count++; 
} 

在循環需要之間的值 - num.length其中num.length = 30。

因此在某些點,你的程序試圖執行

num[30] = input.nextInt(); 

這將導致錯誤! Cos 超出數組索引的範圍。正確的指數範圍應在和之間。

兩種可能的修正是:

從0迴路 - (num.length - 1):

for(i = 0; i <= num.length - 1; i++){ 

    num[i] = input.nextInt(); 

    if (num[i] == 0) 
     break; 

    count++; 
} 

環路從1 - num.length同前,但更新NUM的索引適當地:

for(i = 1; i <= num.length1; i++){ 

    int index = i - 1; 

    num[index] = input.nextInt(); 

    if (num[index] == 0) 
     break; 

    count++; 
}