【JavaSE】java.lang.UnsupportedOperationException异常分析

如下代码:

public static void main(String[] args) {

	 String[] strings = "qqq,www,eee,rrr".split(",");
	 List<String> strList = Arrays.asList(strings);
	 
	 strList.add("ttt"); //java.lang.UnsupportedOperationException
     strList.remove("eee"); //java.lang.UnsupportedOperationException
     
	 Iterator<String> it = strList.iterator();
	 while (it.hasNext()) {
	     if ("www".equals(it.next())) {
	         it.remove(); //java.lang.UnsupportedOperationException
	     }
	 }
	 
 }

出现异常:

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at java.util.AbstractList.remove(AbstractList.java:161)
	at java.util.AbstractList$Itr.remove(AbstractList.java:374)

异常分析:

通过源码可以发现,Arrays.asList()返回的是Arrays的静态内部类java.util.Arrays.ArrayList而不是java.util.ArrayList!!!
在这里插入图片描述在这里插入图片描述
不管是哪个ArrayList,都继承于抽象类abstractList,源码中可以看到addremove方法是在抽象类abstractList中定义,方法内容是抛出一个UnsupportedOperationException异常。
在这里插入图片描述
继续去对比两个不同的ArrayList可以发现,
java.util.ArrayList继承了abstractList并重写了addremove等相关方法;而java.util.Arrays.ArrayList继承了abstractList却并没有进行重写。

回到第二张图,可以发现:Arrays的静态内部类java.util.Arrays.ArrayList定义的是一个final修饰的不可变数组,一旦初始化后,这个数组的长度就是固定的,而这也是其不可进行add或remove的根本原因。

分析到此异常原因应该已然明了了。对于Iteratorremove方法抛出该异常的原因也是同理。

alibaba的代码规范检查中有如下这句话:
在这里插入图片描述
解决方法:

String[] strings = "qqq,www,eee,rrr".split(",");
List<String> strList = new ArrayList<>(Arrays.asList(strings));

说到 Arrays.asList,便也顺便提一嘴。

在只传一个参数的情况下,IDEA会建议你使用 Collections.singletonList() 代替Arrays.asList()。如下图。
在这里插入图片描述
两者主要有两点区别:

  1. Collection.singletonList 长度为 1,只存储一个元素;Arrays.asList 可存储多个元素。
  2. Collection.singletonList 初始完后不可修改【添加、移除、修改均不支持】;Arrays.asList 初始完后数组长度固定,但元素可修改【添加、移除不支持,支持修改值(set方法)】。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值