zoukankan      html  css  js  c++  java
  • Exception in thread "main" java.lang.UnsupportedOperationException

    如果你尝试修改Arrays.asList方法生产的List,那么就会报这个错误

    public static void main(String[] args) {
        Integer[] arr = new Integer[]{7,8,9};
        List<Integer> list = Arrays.asList(arr);
        list.add(4);
    }

    Exception in thread "main" java.lang.UnsupportedOperationException
      at java.util.AbstractList.add(AbstractList.java:148)
      at java.util.AbstractList.add(AbstractList.java:108)

    --

    看一下asList方法

    /**
     * 返回一个固定长度的ArrayList
     * @param a
     * @param <T>
     * @return
     */
    public static <T> List<T> asList(T... a) {
        return new Arrays.ArrayList<>(a);
    }

    而这里返回的ArrayList,是Arrays工具类内部的一个私有内部类

    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        // 这里的数组是一个final的,说明这个数组结构不会发生改变,也就是定长数组
        private final E[] a;
        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
    
    ......

    这个类继承了AbstractList抽象类,只实现了get/set方法,但是没有实现add/remove方法。而AbstractList里面的add/remove方法的默认逻辑是:

    // add
    public boolean add(E e) {
        add(size(), e);
        return true;
    }
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
    
    // remove
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

    所以 Arrays.asList(arr) 返回的List是无法增删的,但是可以读取和修改。

    public static void main(String[] args) {
        Integer[] arr = new Integer[]{7,8,9};
        List<Integer> list = Arrays.asList(arr);
        // list.add(4);
        // 可以调用List的方法
        list.set(0, 1);
        // 也可以直接修改原数组
        arr[1] = 2;
        arr[2] = 3;
        list.forEach(System.out::println);
    }

    输出:

  • 相关阅读:
    cookie 和 session 和 session id
    getMasterRequest VS getCurrentRequest?
    drupal 7 watchdog 记录debug信息
    刷环境
    再进一步
    7zip 不见 .git
    为什么我记不住密码
    www / publish
    behat debug / class property
    drupal 网站Log
  • 原文地址:https://www.cnblogs.com/LUA123/p/13490938.html
Copyright © 2011-2022 走看看