Arraylist java.lang.IndexOutOfBoundsException:索引3超出长度3的界限错误

Arraylist java.lang.IndexOutOfBoundsException:索引3超出长度3的界限错误,java,arraylist,indexoutofboundsexception,Java,Arraylist,Indexoutofboundsexception,我创建了一个方法,它接受字符串的Arraylist和整数。它将删除所有长度小于给定整数的字符串 例如: Arraylist=[“abcde”、“aabb”、“aaabb”、“abc”、“ab”] 整数=4 因此新的Arraylist应该是:[“abcde”、“aabb”、“aaabbb”] 但我收到了这个错误信息: 线程“main”java.lang.IndexOutOfBoundsException中的异常:索引3超出长度3的界限 这是我的密码: publicstaticvoidmain(字符

我创建了一个方法,它接受字符串的
Arraylist
和整数。它将删除所有长度小于给定整数的字符串

例如:

Arraylist=[“abcde”、“aabb”、“aaabb”、“abc”、“ab”]

整数=4

因此新的
Arraylist
应该是:[“abcde”、“aabb”、“aaabbb”]

但我收到了这个错误信息:

线程“main”java.lang.IndexOutOfBoundsException中的异常:索引3超出长度3的界限

这是我的密码:

publicstaticvoidmain(字符串[]args){
ArrayList newArrayList=新ArrayList();
添加(“string1”);
添加(“string2”);
newArrayList.添加(“rem”);
newArrayList.add(“dontremove”);
removeElement(newArrayList,4);//新arraylist必须=[string1,string2,dontremove]
}
公共静态void removeElement(ArrayList ArrayList,int-inputLen){
int arrayLen=arraylist.size();
对于(int i=0;i
问题是索引的值为4

但是一旦你从列表中删除一个项目,你现在只有3个条目

因此,在您的循环中,当您尝试访问第四个条目时,您现在将得到一个
IndexOutOfBounds
错误

解决方案是从ArrayList的末尾开始,然后倒计时到0

For (int i = arrayLen - 1; i >= 0; i--)
在循环内部,您不需要:

i--;

您在对列表的索引进行迭代时正在修改列表。一旦删除第一项,列表将比您预期的短,并且一旦达到原始最后一个元素的索引,就会出现此错误。幸运的是,该方法可以为您完成繁重的工作:

public static void removeElement(List<String> arraylist, int inputLen) {
    arraylist.removeIf(s -> s.length() < inputLen);
    System.out.println("New Arraylist: " + arraylist);
}
publicstaticvoidremoveelement(列表arraylist,int-inputLen){
arraylist.removeIf(s->s.length()
移除元素时,数组的长度应该改变。
arrayLen
变量存储数组的长度,但当数组的长度缩小时不会改变。要改变它,您应该能够用
arrayList.size()替换
arrayLen
,当您删除元素时,该值将发生变化

您正在从0循环到数组大小4。在循环中,您正在删除项目,因此数组大小将小于4,因此您将获得此异常。 尝试这样循环:

Iterator<String> iterator = arraylist.iterator();

while (iterator.hasNext()) {
    String word = iterator.next();
    if (word.length() < inputLen) {
        iterator.remove();
    }
}
Iterator Iterator=arraylist.Iterator();
while(iterator.hasNext()){
String word=iterator.next();
if(word.length()
No,解决方案是使用迭代器。您的建议仍然可能抛出
ConcurrentModificationException
@chrylis-cautiouslyoptimistic-,不,它不会抛出ConcurrentModificationException。它不使用foreach。代码所做的只是访问ArrayList中的一项。ArrayList不知道或不关心代码是否正确在循环中执行。啊,请尽量更正。感谢您的帮助。除了逻辑错误之外,名称
removeElement
表示您的方法将删除第4个元素。相反,类似
removeElementsLongerThan的名称将更有助于人们阅读您的代码。此外,您通常不应是变量和参数,如
ArrayList
;。正确,但OP的总体代码风格表明,实现
removeIf
的功能是练习的重点。是的,我知道这是解决这个问题的另一种方法。但我想用我使用的方法解决这个问题。比如使用“for”声明。非常感谢您的帮助。
Iterator<String> iterator = arraylist.iterator();

while (iterator.hasNext()) {
    String word = iterator.next();
    if (word.length() < inputLen) {
        iterator.remove();
    }
}