java.lang.UnsupportedOperationException解决方法

本文讨论了在Java开发中,如何按学生年龄分组时遇到UnsupportedOperationException的问题,原因在于使用了Arrays.asList()创建List。解决方案包括创建标准ArrayList或利用Java8StreamAPI进行分组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在实际开发中经常会有类似的这种代码,想要按类的某一个属性对列表中的元素分组。

例如:
有一些学生,然后根绝他们的年龄对他们进行分组。可以写出如下代码。

public class UnsupportedOperationExceptionDemo {

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Student {
        private String name;

        private Integer age;
    }

    public static void main(String[] args) {
        // 初始化几个学生
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student("张三", 18));
        studentList.add(new Student("李四", 19));
        studentList.add(new Student("王五", 18));
        studentList.add(new Student("赵六", 20));

        // 根据年龄对这个分组
        Map<Integer, List<Student>> map = new HashMap<>();
        for (Student student : studentList) {
            if (map.containsKey(student.getAge())) {
                List<Student> students = map.get(student.getAge());
                students.add(student);
            } else {
                map.put(student.getAge(), Arrays.asList(student));
            }
        }
    }
}

运行结果:
在这里插入图片描述
这是为什么呢?

原因分析

在for循环中如果集合中没有这个年龄的学生,则需要创建一个List然后将元素加入,所以偷了一下懒,直接使用了Arrays.asList(student)这样的代码。

问题就出在这一行代码!!!!

看一下asList的源码,发现也是new ArrayList(a)
在这里插入图片描述
不过仔细看一下这个ArrayList的全限定名是java.util.Arrays.ArrayList而不是我们平常使用的java.util.ArrayList

那这两个有何不同?为什么会报错?
因为上面的代码调用了java.util.Arrays.ArrayList对象的add方法,这个类并没有重写add方法,所以直接使用父类java.util.AbstractList中的方法,而父类的add方法就是会抛出UnsupportedOperationException异常
在这里插入图片描述

解决方案

方案一:创建java.util.ArrayList对象来存放元素
在这里插入图片描述

方案二:使用Java 8的Stream流来处理

Map<Integer, List<Student>> map = 
		studentList
			.stream()
			.collect(Collectors.groupingBy(Student::getAge));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值