千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:沈阳千锋IT培训  >  技术干货  >  解决UnsupportedOperationException 异常的过程

解决UnsupportedOperationException 异常的过程

来源:千锋教育
发布人:lx
时间: 2023-03-24 13:57:00

  一. 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");

  }

 

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

为什么会出现ref?

2023-05-05

防抖和节流是什么?

2023-04-27

JS的原型与原型链是什么?

2023-04-20

最新文章NEW

什么是redux?

2023-05-05

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

2023-04-27

负载均衡原理是什么?

2023-04-25

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>