字符串数组转换成List后,新添字符串时报UnsupportedOperationException(已解决)

65 阅读1分钟

今天下午在编写代码的过程中遇到一个问题,就是需要在字符串数组中新添字符串,为了效率更高,没有选择利用数组的复制这个方法,而是使用了字符串数组转换成集合的方式新增元素,然后再将该集合转换成数组即可;
但编写完代码,一运行,就出现java.lang.UnsupportedOperationException这个异常;

image.png

具体代码如下:

 public static void strAppend(String[] strArr, String name) {
        List<String> strList = Arrays.asList(strArr);
        strList.add(name);
        System.out.println(strList);
        strArr = strList.toArray(new String[0]);
        for (String str : strArr) {
            System.out.println(str);
        }
    }

在网上查看如何解决该异常时,发现有人已经解决了这个问题,受益匪浅;
如何解决UnsupportedOperationException异常问题_java_脚本之家 (jb51.net)
原因是因为利用asList方法将数组转换成一个集合时并不是我们日常使用的ArrayList, 而是Arrays类中的一个内部类ArrayList;
如下图:

image.png

这个内部类ArrayList继承了抽象类AbstractList,但并没有重写add()方法,此时调用add()方法,实际上是执行的抽象类AbstractList中的add方法,才抛出异常;
这是AbstarctList抽象类中的add方法;异常就是从这里抛出的

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

所以解决办法是新建一个我们熟知的ArrayList集合,在该集合中重写了add方法,当我们调用add方法时,就不会再抛出异常;
具体代码如下:

  public static void strAppend(String[] strArr, String name) {
  // 改变在这里,需要new ArrayList即可;
        List<String> strList = new ArrayList<>(Arrays.asList(strArr));
        strList.add(name);
        System.out.println(strList);
        strArr = strList.toArray(new String[0]);
        for (String str : strArr) {
            System.out.println(str);
        }
    }

问题得以解决!!!