UnsupportedOperationException异常解析

15 篇文章 0 订阅
10 篇文章 0 订阅

今天 遇到了一个bug,抛出的异常大致是下面这样的。

java.lang.UnsupportedOperationException: null
    at java.util.AbstractList.add(AbstractList.java:148) ~[?:1.8.0_131]
    at java.util.AbstractList.add(AbstractList.java:108) ~[?:1.8.0_131]

代码大致内容和下面这个差不多

public class test {
  public static void main(String[] args) {
    //定义一个字符长度为5的字符串
    String[] strings = new String[5];
    strings[0] = "a";
    strings[1] = "b";
    strings[2] = "c";
    strings[3] = "d";
    strings[4] = "e";

    //调用Arrays中的asList方法将String[]转化为List<String>
    List<String> list = Arrays.asList(strings);
    System.out.println("list<String>:"+list.toString());

   //为list添加一个元素
   list.add("f");
    System.out.println("list<String>:"+list.toString());
  }
}

表面上看是没有什么问题的,我们在将数组转成List的时候也经常会这么做,但是执行这样的代码的时候还是报错了,这就很奇怪。

我们看一下上面的报错信息得知是在AbstractList.java:148位置报的错,我们找到对应的位置

 调用这个方法时总是抛出异常。

我们在看一下这个位置AbstractList.java:108

都是英文看不懂,翻译翻译,看看说的是啥

 

 哦 这里面让我们注意不重写这个add(int,e)方法的话就会抛出上面的异常。

 问题其实是出在这一行

List<String> list = Arrays.asList(strings);

Arrays.asList(strings);方法返回的List对象不是我们常见的ArrayList,而是Arrays的一个内部类

 让我们看一下这个内部类都有哪些方法

 其中并没有重写add方法,所以在调用add方法的时候会执行父类的add方法(也就是上面我们截图的方法),这样报错的原因就找到了。

找到原因后,问题就好解决了,我们把返回的对象处理一下 转成我们熟悉的List实现类就可以了,

方法一:

List<String> list = new ArrayList<>(Arrays.asList(strings));

方法二:

List<String> list = new ArrayList<>();
list.addAll(Arrays.asList(strings));

搞定!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值