UnsupportedOperationException异常解析

UnsupportedOperationException异常解析,第1张

UnsupportedOperationException异常解析

今天 遇到了一个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
    List list = Arrays.asList(strings);
    System.out.println("list:"+list.toString());

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

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

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

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

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

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

 

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

 问题其实是出在这一行

List list = Arrays.asList(strings);

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

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

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

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

方法一:

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

方法二:

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

搞定!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4659630.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存