全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货  >  详情

解决UnsupportedOperationException 异常的过程

来源:千锋教育
发布人:lx
2023-03-24

推荐

在线提问>>

  一. bug 重现

  近日一个学生,在写代码的过程中,使用工具类 Arrays . asList() 把数组转换成集合,然后他想往数组转换的集合中再添加新的元素,结果莫名其妙的抛出了 UnsupportedOperationException 的异常.

解决UnsupportedOperationException 异常

  核心代码如下

  public static void main(String[] args) {

  // 1 构建原始的数组

  String[] strArray = new String[] { "i", "love" };

  // 2 通过Arrays.asList 工具把数组转成List 集合

  List strList = Arrays.asList(strArray);

  // 3 往集合中添加元素

  strList.add("you");

  }

  运行结果如下

1647345478379

  二. bug原因分析

  打开Arrays.asList 这个方法的源代码我们可以发现: asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。 Arrays . asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。

  // 这是Arrays.asList 的源代码

  public static List asList(T... a) { return new ArrayList<>(a);}

  // 这是静态内部类ArrayList的源代码

  private static class ArrayList extends AbstractList

  implements RandomAccess, java.io.Serializable

  {

  private static final long serialVersionUID = -2764017481108945198L;

  private final E[] a;

  ArrayList(E[] array) {

  a = Objects.requireNonNull(array);

  }

  @Override

  public int size() {

  return a.length;

  }

  @Override

  public Object[] toArray() {

  return a.clone();

  }

  @Override

  @SuppressWarnings("unchecked")

  public T[] toArray(T[] a) {

  int size = size();

  if (a.length < size)

  return Arrays.copyOf(this.a, size,

  (Class) a.getClass());

  System.arraycopy(this.a, 0, a, 0, size);

  if (a.length > size)

  a[size] = null;

  return a;

  }

  @Override

  public E get(int index) {

  return a[index];

  }

  @Override

  public E set(int index, E element) {

  E oldValue = a[index];

  a[index] = element;

  return oldValue;

  }

  @Override

  public int indexOf(Object o) {

  E[] a = this.a;

  if (o == null) {

  for (int i = 0; i < a.length; i++)

  if (a[i] == null)

  return i;

  } else {

  for (int i = 0; i < a.length; i++)

  if (o.equals(a[i]))

  return i;

  }

  return -1;

  }

  @Override

  public boolean contains(Object o) {

  return indexOf(o) != -1;

  }

  @Override

  public Spliterator spliterator() {

  return Spliterators.spliterator(a, Spliterator.ORDERED);

  }

  @Override

  public void forEach(Consumer action) {

  Objects.requireNonNull(action);

  for (E e : a) {

  action.accept(e);

  }

  }

  @Override

  public void replaceAll(UnaryOperator operator) {

  Objects.requireNonNull(operator);

  E[] a = this.a;

  for (int i = 0; i < a.length; i++) {

  a[i] = operator.apply(a[i]);

  }

  }

  @Override

  public void sort(Comparator c) {

  Arrays.sort(a, c);

  }

  }

  三. bug 修改

  我们只要把由数组转成的集合,通过ArrayList的构造方法,转成一个新的集合就可以完美解决该问题

  public static void main(String[] args) {

  // 1 构建原始的数组

  String[] strArray = new String[] { "i", "love" };

  // 2 通过Arrays.asList 工具把数组转成List 集合

  List strList = Arrays.asList(strArray);

  // 3 把strList 包装成一个新的ArrayList

  List newStrList = new ArrayList<>(strList);

  // 4 往新的集合中添加新元素

  newStrList.add("you");

  }

 

相关文章

什么是redux?

为什么会出现ref?

防抖和节流是什么?

vue的计算属性,特性,应用是什么?

负载均衡原理是什么?

开班信息 更多>>

课程名称
全部学科
咨询

HTML5大前端

Java分布式开发

Python数据分析

Linux运维+云计算

全栈软件测试

大数据+数据智能

智能物联网+嵌入式

网络安全

全链路UI/UE设计

Unity游戏开发

新媒体短视频直播电商

影视剪辑包装

游戏原画

    在线咨询 免费试学 教程领取