2016-02-19 90 views
-1

爲什麼在以下代碼段中拋出IndexOutOfBoundsException? 我似乎無法理解爲什麼它被拋出?爲什麼會拋出IndexOutOfBoundsException?

import java.util.*; 
    public class PrimeNumbers { 

     //Printing all prime numbers less than 600 using 'Sieve Method' 
     final static int SIZE = 600; 
     static ArrayList<Integer> numbers = new ArrayList<Integer>(SIZE); 


     public static void populateList(ArrayList<Integer> arraylist){ 
      for(int i=0; i<SIZE; i++){ 
       arraylist.add(i, i); 
      } 
     } 

     public static void filterMultiples(ArrayList<Integer> arraylist){ 
      for(int i=0; i<SIZE; i++){ 
       if(arraylist.get(i)%2==0 || arraylist.get(i)%3==0 || arraylist.get(i)%5==0){ 
        arraylist.remove(i); 
        } 
       } 
      } 

     public static void main(String[] args){ 
      populateList(numbers); 
      filterMultiples(numbers); 
      System.out.println(numbers); 

     } 
    } 

堆棧跟蹤:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 300, Size: 300 
at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
at java.util.ArrayList.get(ArrayList.java:429) 
at PrimeNumbers.filterMultiples(PrimeNumbers.java:17) 
at PrimeNumbers.main(PrimeNumbers.java:25) 

回答

2
for(int i=0; i<SIZE; i++){ 
    if(arraylist.get(i)%2==0 || arraylist.get(i)%3==0 || arraylist.get(i)%5==0){ 
     arraylist.remove(i); 
     } 
    } 
} 

你迭代從0到SIZE,但移除元素會導致那裏是在列表中少於SIZE元素。

1

該錯誤是在該塊中:

 for(int i=0; i<SIZE; i++){ 
      if(arraylist.get(i)%2==0 || arraylist.get(i)%3==0 || arraylist.get(i)%5==0){ 
       arraylist.remove(i); 
       } 
      } 
     } 

當你通過數組列表迭代,則從中刪除元素。因此,它變得更短,尺寸變得比實際尺寸(600)小。

請嘗試使用迭代器。它們在迭代時支持修改:

for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) { 
     int number = iterator.next(); 
     if (number % 2 == 0 || number % 3 == 0 
       || number % 5 == 0) { 
      iterator.remove(); 
     } 
    } 
相關問題