嘎里三分熟
  • 首页
  • JMusic
  • TSBay
  • 常用工具
  • About Me
  • 留言板
一行代码一世浮生
  1. 首页
  2. Bug集中营
  3. 正文

Java异常之:UnsupportedOperationException

2017年07月13日 2010点热度 2人点赞 0条评论

一、异常产生

最近在一个坑上连续踩了两次,不开心,刨了下根,揪出了罪魁祸首,下面是异常信息:

bugUnsupportOperation.png

下面我们情景再现一下,写了段测试代码:

@Test
public void test() {
    People james = new People("James", 18);
    People skye = new People("Skye", 18);
    List<People> peoples = Arrays.asList(james);
    peoples.add(skye);
    System.out.println(peoples);
}

代码很简单,就是使用 Arrays 这个工具类新建了一个 List,然后往里塞了点内容,就是调用 add 方法的时候报异常了,尴尬。

二、异常解决

很简单,他不给我使用 add 方法就不用呗,换个套路重走阳关道,使用最原始的 List 的 addAll 方法。

@Test
public void test() {
    People james = new People("James", 18);
    People skye = new People("Skye", 18);
    List<People> peoples = new ArrayList<>();
    peoples.addAll(Arrays.asList(james, skye));
    System.out.println(peoples);
}

三、异常分析

这个异常直译比较好理解,就是 不支持的操作,简言之就是通过 Arrays.asList 创建的集合,不支持 add 这种方法,好吧,下面是源码:

bugUnsupportOperation02.png

源码里边我们已经看到,返回的 List 是固定大小的,所以 任改变大小的操作,类似 add、remove 等都会报异常。

好奇心趋势我看了下返回的List 的类型:

bugUnsupportOperation03.png

Soga,原来工具类直接创建的是 Array$ArrayList。

那么异常是从哪报出来的呢?

其实你往里深究,像 ArrayList 等,都是继承自抽象类 AbstractList,在这个类里面我们率先找到了异常出处,好家伙,藏在这呢:

bugUnsupportOperation04.png

四、实用性

这也有实用性?好吧,我承认只是自己突然想到的一个点也许可以使用。

就是当我们需要一个 List,但是不允许修改其 size 咋办,此时可以自定义一个 类去扩展 AbstractList 不就好了,

至于日后想加上改变 size 的功能,可以另外在扩展类里面手动添加不就好了,

好吧,虽然这个点没什么用,但也是一种想法是吧。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: AbstractList ArrayList Arrays.asList() bug UnsupportedOperationException 集合
最后更新:2017年07月13日

GoldenJet

爱折腾技术的90后漫威小死忠程序员一枚

点赞
下一篇 >

文章评论

取消回复

通过电子邮件订阅博客

分类目录
  • BootStrap (2)
  • Bug集中营 (6)
  • Java web (3)
  • JavaScript (7)
  • Java基础 (17)
  • Java工具 (5)
  • Linux (3)
  • Python (3)
  • SpringBoot (14)
  • Spring基础 (8)
  • thymeleaf (1)
  • 娱乐 (3)
  • 小谈 (2)
  • 常用工具 (7)
  • 技术分析集 (5)
  • 技能 (10)
  • 源码 (4)
  • 科普类 (1)
  • 算法 (9)
  • 踩坑记 (5)
文章归档
  • 2020年11月 (1)
  • 2020年7月 (1)
  • 2020年4月 (2)
  • 2020年3月 (1)
  • 2020年1月 (1)
  • 2019年11月 (1)
  • 2019年10月 (1)
  • 2019年9月 (1)
  • 2019年8月 (1)
  • 2019年7月 (2)
  • 2019年5月 (2)
  • 2019年4月 (2)
  • 2019年3月 (3)
  • 2019年2月 (2)
  • 2019年1月 (2)
  • 2018年12月 (2)
  • 2018年11月 (3)
  • 2018年10月 (3)
  • 2018年9月 (2)
  • 2018年8月 (3)
  • 2018年7月 (2)
  • 2018年5月 (1)
  • 2018年4月 (3)
  • 2018年3月 (2)
  • 2018年2月 (3)
  • 2018年1月 (5)
  • 2017年12月 (2)
  • 2017年11月 (3)
  • 2017年10月 (1)
  • 2017年9月 (1)
  • 2017年8月 (1)
  • 2017年7月 (7)
  • 2017年6月 (5)
  • 2017年5月 (1)
  • 2017年4月 (2)
  • 2017年3月 (4)
  • 2017年2月 (2)
小伙伴友链
  • 前端驿站

COPYRIGHT © 2017-2020 嘎里三分熟. ALL RIGHTS RESERVED.

浙ICP备17005575号-1

浙公网安备 33010802009043号