处理用户输入时ArrayList IndexOutOfBoundsException

时间:2012-10-01 17:50:31

标签: java arraylist

我正在尝试编写一个使用sentinal contolled do-while循环的程序,它反复询问用户正整数。

当用户输入负值时,循环应该结束。循环完成后,程序应打印出正数的最小值,最大值,平均值和计数 由用户输入。

然而,当我运行程序时,我收到错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at posNeg.main(posNeg.java:31)

我已经搜索了答案,但似乎没有一个工作。大多数建议您从=删除for (int i = 0; i <= (count); i++) {

无论如何,这是完整的代码:

import java.util.*;
import java.lang.Math;

public class posNeg {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        ArrayList list = new ArrayList();
        int num;
        int count = 0;

        do{
            System.out.println("enter pos nums (or a neg num to quit): ");
            num = sc.nextInt();
            list.add(num);
            count++;
        } while (num >= 0);

        Iterator it = list.iterator();

        list.remove(list.get(count-1));

        Object max = Collections.max(list);
        Object min = Collections.min(list);

        System.out.print(list);

        int tot = 0;
        for (int i = 0; i <= (count); i++) {
            Object piece = list.get(i);
            int piecenum = ((Number) piece).intValue();
            tot = tot + piecenum;
        }

        double avg;
        avg = tot/count;

        System.out.println("the max is "+max+". the min is "+min+". the avg is "+avg);
    }
}

6 个答案:

答案 0 :(得分:1)

构建列表时,会增加计数。

在构建count==list.size()之后。

之后,您从列表中删除一项,但不要更改count

所以count==list.size()-1

所以你的循环应该是

for (int i = 0; i <= count-2; i++) {

因为您有从索引0count-2的商品。

但不是保持计数,你可以简单地做

for (int i = 0; i<list.size(); i++) {

答案 1 :(得分:0)

看看这个循环:

for (int i = 0; i <= (count); i++) {

此时列表中只有count - 1项,但您循环count + 1次。为了理智,你应该在调用count之后递减remove,然后将循环更改为更惯用的:

for (int i = 0; i < count; i++) {

或者更简单:

for (Number number : list) {
    ...
}

只有在list通用后才能使用此功能:

List<Number> list = new ArrayList<Number>();

你应该真的使用泛型来收藏。

答案 2 :(得分:0)

最好这样做......

for (int i = 0; i < (count); i++) {


 }

使用For-Each循环

for(Number n : list){


}

答案 3 :(得分:0)

正如其他人所指出的那样,这个错误是有罪的。我建议在输入循环中使用条件break;以避免将负值添加到列表中,并递增计数。首先。每当使用基于零索引的语言时,您仍需要将<=替换为<

答案 4 :(得分:0)

尝试此list.size而非计数

for (int i = 0; i < list.size(); i++) {
            Object piece = list.get(i);
            int piecenum = ((Number) piece).intValue();
            tot = tot + piecenum;
        }

答案 5 :(得分:0)

一些建议,,,

    do{
        System.out.println("enter pos nums (or a neg num to quit): ");
        num = sc.nextInt();
        if (num >= 0)
           break;
        list.add(num);
    }while (true);

..并为下一个循环

    int tot = 0;
    for (int i : list ) {
        //do your stuff
    }

..但你应该使用打字列表

  List<int> list = new ArrayList<int>()

......或类似的东西