zoukankan      html  css  js  c++  java
  • java.lang.UnsupportedOperationException 异常分析

    问题:数组转换成 List 然后进行 remove 操作时却抛出 java.lang.UnsupportedOperationException 异常。

    String pattern = " ^, v, m, n-music-name, $ ";
    String[] patternSplit = Utils.getStringTrimSplit(pattern, ",");
     
    // 去除模式中的^和$标识
    List<String> natureList = Arrays.asList(patternSplit);
    if ("^".equals(natureList.get(0))) {
        natureList.remove(0); // throw java.lang.UnsupportedOperationException
    }
    if ("$".equals(natureList.get(natureList.size() - 1))) {
        natureList.remove(natureList.size() - 1); // throw java.lang.UnsupportedOperationException
    }
     
    String[] natureArray = natureList.toArray(new String[natureList.size()]);
    System.out.println(natureArray.length);

    看了下源码才发现使用 Arrays.asList(arr) 转换的 List 并不能进行 add 和 remove 操作。
    Arrays.asList(arr) 返回的类型是 Aarrays$ArrayList 并不是 ArrayList,
    Aarrays$ArrayList 和 ArrayList 都继承 AbstractList,但是 AbstractList 中的 add 方法和 remove 方法都是直接抛出 UnsupportedOperationException,并没有直接实现。
    ArrayList 重写了 add 方法和 remove 方法,能够进行对应的添加和删除操作,Aarrays$ArrayList 却没有去重写,所以此时调用 add 方法和 remove 方法会抛出 UnsupportedOperationException。

    解决办法

    // old
    List<String> natureList = Arrays.asList(patternSplit);
    // new 
    List<String> natureList = new ArrayList<>(Arrays.asList(patternSplit));

    源码

    Arrays.asList(arr) 返回 Aarrays$ArrayList , Aarrays$ArrayList 继承 AbstractList

    ArrayList 继承 AbstractList

    AbstractList 中的 add 方法和 remove 方法都直接抛出 UnsupportedOperationException

    ArrayList 重写 add 方法和 remove 方法

  • 相关阅读:
    linux 命令——48 watch (转)
    linux 命令——47 iostat (转)
    linux 命令——46 vmstat(转)
    linux 命令——45 free(转)
    linux 命令——44 top (转)
    linux 命令——43 killall(转)
    linux 命令——42 kill (转)
    linux 命令——41 ps(转)
    linux 命令——40 wc (转)
    Java for LeetCode 068 Text Justification
  • 原文地址:https://www.cnblogs.com/huangjinyong/p/14067014.html
Copyright © 2011-2022 走看看