java的List 的remove抛出异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的List 的remove抛出异常相关的知识,希望对你有一定的参考价值。

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

public class Student
public String name;
public String id;
public List mycourse;
public Student(String id,String name,Course course[])
this.id = id ;
this.name = name;
this.mycourse = Arrays.asList(course);
System.out.println("你的选课为:");
Course[] temp = new Course[5];
for (int i = 0;i<mycourse.size();i++)
temp[i] = (Course) mycourse.get(i);
if(temp[i]==null)

else
System.out.println(temp[i].id+"-"+temp[i].name);


System.out.println("确认选课无误吗?是-1 否-0");
Scanner in = new Scanner(System.in);
int judge;
if ((judge = in.nextInt())== 1)

else
System.out.println("你想进行什么操作?增添课程-1 移除课程-0");
if((judge=in.nextInt())==0)
System.out.println("按屏幕先后顺序输入1-5,即可移除对应课程:");
for (int i = 0;i<mycourse.size();i++)
temp[i] = (Course) mycourse.get(i);
if(temp[i]==null)

else
System.out.println(temp[i].id+"-"+temp[i].name);


int x =in.nextInt();
mycourse.remove(x-1);





哪里错了,为什么老是抛出这个异常
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(Unknown Source)
at com.Collection.me.Student.<init>(Student.java:54)
at com.Collection.me.call.<init>(call.java:47)
at com.Collection.me.Main.main(Main.java:9)

mycourse.remove(x-1);

这种list不支持remove操作追问

那需要怎么改呢?改成什么类型的集合呢?

追答

Arrays.asList返回的List直接以数组为底层的数据,数组是不可变的。

可以使用ArrayList或者LinkedList,Vector,很多集合都可以的。

参考技术A 构造方法里实现过程,看着不能习惯咧 参考技术B 要看 x-1 的结果是多少

~

java 中list进行动态remove处理

java中遍历 list遇到需要动态删除arraylist中的一些元素 的情况

错误的方式

for(int i = 0, len = list.size(); i < len; i++){  
    if(list.get(i) == 1) {  
       list.remove(i);  
    }  
}  

这样会抛出异常

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

这个异常是因为删除元素之后未改变相应角标,遍历到最后一个 的时候 就会找不到抛出 这个异常

正确做法删除下标以及定位到遍历位置

for(int i = 0, len = list.size(); i < len; i++){  
    if(list.get(i) == 1){  
       list.remove(i);  
       len--;
       i--;
    }  
}

或者使用Java的Iterator接口来实现遍历

Iterator<Integer> iterator = list.iterator();  
while(iterator.hasNext()){  
    int i = iterator.next();  
    if(i == 1){  
        iterator.remove();  
    }  
}

 

以上是关于java的List 的remove抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

字典方法 Remove 和 Clear (.NET Core) 在枚举期间修改集合。没有抛出异常

java 中list进行动态remove处理

JUC并发编程--- 阻塞队列和同步队列使用

Java队列的部分调用方法

Java队列的部分调用方法

Spock 抛出异常测试