报错:java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148)

问题:使用 Collections.emptyList() 声明对象,调用 add 方法报错。
List<String> list = Collections.emptyList();
list.add("a");
报错信息:java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148)
报错截图

报错截图

报错原因

需要了解 Collections.emptyList(); 内部实现。

首先创建一个对象 new EmptyList<>() 。

public static final List EMPTY_LIST = new EmptyList<>();
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

然后调用 EmptyList 类里的 add 方法,而 EmptyList 类 没有重写 add 方法,因此使用其父类的 add 方法,而父类 AbstractList 的 add 方法内部实现是抛异常,所以最后报错。

private static class EmptyList<E>
        extends AbstractList<E>
        implements RandomAccess, Serializable {
        ...
   }

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
	...
    public boolean add(E e) {
        add(size(), e);
        return true;
    }
       public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
    ...
}
解决方案

如果要调用 add 方法,就声明一个具体的实现类。

List<String> list = new ArrayList<>();
list.add("a");
根据提供的引用内容,抛出异常"java.lang.UnsupportedOperationException"的原因是对不支持的操作进行了调用。这个异常通常在对不可变或只读的集合进行修改操作时抛出,比如使用了继承自`java.util.AbstractList`的`List`类的`remove`方法。引用中的异常栈显示了抛出异常的具体位置,其中`AbstractList.remove`和`AbstractList$Itr.remove`表示在`AbstractList`类和`AbstractList$Itr`类的`remove`方法中抛出了异常。这个异常也可以在使用`asList`方法继承的父类的`add`和`remove`方法时抛出,比如`java.util.ArrayList`类重写了父类的`add`和`remove`方法。引用提供了一个关于`asList`方法的解释,说明了为什么会抛出`UnsupportedOperationException`异常。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java.lang.UnsupportedOperationException异常(csdn)————程序.pdf](https://download.csdn.net/download/qq_60706858/53598513)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [java.lang.UnsupportedOperationException 异常的解决方法及相关原因](https://blog.csdn.net/weixin_43228155/article/details/122866078)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [java.lang.UnsupportedOperationException的解决方法](https://blog.csdn.net/weixin_64738832/article/details/125085433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值