java编程线程“main”中的异常是什么错误?

时间:2014-11-11 07:28:16

标签: java arraylist

我编写了这个程序来查找项目,然后删除所有小于项目的元素。没有编译错误,但是当我运行程序时,会出现以下消息。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.remove(ArrayList.java:492)
    at bb.deleteValues(bb.java:15)
    at bb.main(bb.java:33)

Process completed. "

代码:

import java.util.ArrayList;
import java.util.Scanner;


public class bb {
public static   boolean deleteValues(ArrayList<Integer> list, int item)
    { int p =list.indexOf(item);
        if(!list.contains(item))
            return false;
            else 
                for(int i=p; i<list.size();i++ )
                {int n=list.get(i);
                if (n>list.get(i+1))
                list.remove(p);
                list.remove(i+1);

                }
                return true; 

    }

    public static void main(String[] args) {
        ArrayList<Integer> a= new ArrayList<Integer>(8);
        a.add(3);
        a.add(10);
            a.add(4);
            a.add(5);
            a.add(3);
            a.add(2);
            a.add(8);
            a.add(6);
            a.add(4);
        if(deleteValues(a,4))
            for(int x : a)
                System.out.print(x+ " ");



    }
}

4 个答案:

答案 0 :(得分:2)

您的deleteValues方法从i循环plist.size()-1,但循环的正文包含list.get(i+1)list.remove(i+1),所以当{{ 1}},i==list.size()-1list.get(i+1)将尝试从列表中不存在的索引访问项目,这是异常的原因。

删除小于传递项的元素需要迭代列表中的所有元素,并将每个元素与传递的list.remove(i+1)进行比较。请注意,当您从列表中删除第i个元素时,第(i + 1)个元素将成为新的第i个元素。这就是为什么只有在你不从列表中删除元素时我才会增加。

item

答案 1 :(得分:0)

list.remove(i+1);将超过list大小。例如,当您传递第4个元素时,它将在5th postion

中搜索元素

答案 2 :(得分:0)

问题出在您的deleteValues函数中,当i小于ArrayList的大小时循环,但在调用get函数时加1,可以和导致IndexOutOfBoundsException,因为它可以使i等于ArrayList的大小,这是无效的。更改for循环,并删除i+1的情况,如下所示:

for(int i=p; i<list.size();i++ )
{
    int n=list.get(i);

    if (n>list.get(i))
        list.remove(p);

    list.remove(i);

}

此外,如果您的函数旨在删除某个值的所有副本,则代码可以更简单,更简单,更清晰:

public static boolean deleteValues(ArrayList<Integer> list, int item)
{
    if (list.contains(item))
    {
        for (int i = 0; i < list.size(); i++)
            if (list.get(i) == item)
                list.remove(i);
        return true;
    }
    return false;
}

答案 3 :(得分:0)

import java.util.ArrayList;
import java.util.Scanner;

    public class Ex {
    public static   boolean deleteValues(ArrayList<Integer> list)
        {

                    for(int i=0; i<list.size();i++ )
                    {int n=list.get(i);
                    if (n>list.get(i+1))
                  //  list.remove(i);
                    list.remove(i+1);

                    }
                    return true; 

        }

        public static void main(String[] args) {
            ArrayList<Integer> a= new ArrayList<Integer>(8);
            a.add(3);
            a.add(10);
               a.add(4);
                a.add(5);
               a.add(3);
                a.add(2);
              a.add(8);
               a.add(6);
              // a.add(4);
            if(deleteValues(a))
                for(int x : a)
                    System.out.print(x+ " ");
        }
    }

你是在指定了itz大小的arraylist中添加了一个额外的对象,你在deleteValues方法中错误地使用了索引值,所以请检查这两个代码。

import java.util.ArrayList;
import java.util.Scanner;


public class Ex {
public static   boolean deleteValues(ArrayList<Integer> list, int item)
    { int p =list.indexOf(item);
        if(!list.contains(item))
            return false;
            else 
                for(int i=0; i<list.size();i++ )
                {int n=list.get(i);
                if (n>list.get(i+1))
                list.remove(p);
                //list.remove(i+1);

                }
                return true; 
    }

    public static void main(String[] args) {
        ArrayList<Integer> a= new ArrayList<Integer>(8);
        a.add(3);
        a.add(10);
            a.add(4);
            a.add(5);
            a.add(3);
            a.add(2);
            a.add(8);
            //a.add(6);
            a.add(4);
        if(deleteValues(a,4))
            for(int x : a)
                System.out.print(x+ " ");
    }
}