当前位置:首页 » 《我的小黑屋》 » 正文

已解决:java.lang.UnsupportedOperationException 异常的正确解决方法,亲测有效!!!

5 人参与  2024年10月29日 13:21  分类 : 《我的小黑屋》  评论

点击全文阅读


java.lang.UnsupportedOperationException 是 Java 中常见的运行时异常之一,通常表示尝试执行某个操作时,该操作在特定情况下不被支持。此异常一般是在使用集合框架或调用某些接口方法时遇到。本文将详细解析此异常的成因,提供多种有效的解决方案,并通过示例代码帮助开发者更好地理解和预防该异常的发生。

1. 问题描述

UnsupportedOperationException 是在调用某些方法时抛出的异常,这些方法的实现明确表示不支持当前的操作。常见的场景包括尝试修改由Arrays.asList()方法返回的固定大小的列表,或者尝试修改不可变的集合。

示例错误信息:

Exception in thread "main" java.lang.UnsupportedOperationException    at java.util.AbstractList.add(AbstractList.java:148)    at java.util.AbstractList.add(AbstractList.java:108)    at java.util.Arrays$ArrayList.add(Arrays.java:4230)    at com.example.Main.main(Main.java:10)

场景描述:

假设我们有以下代码,试图向由Arrays.asList()返回的列表中添加元素:

import java.util.Arrays;import java.util.List;public class Main {    public static void main(String[] args) {        List<String> list = Arrays.asList("apple", "banana", "orange");        list.add("pear"); // 试图修改不可变列表    }}

执行上述代码时,会抛出 UnsupportedOperationException

2. 问题分析

UnsupportedOperationException 的根本原因是代码尝试执行当前对象不支持的操作。常见的情况包括:

2.1 修改不可变的集合

某些集合实现(如Arrays.asList()返回的ArrayList)不支持添加、删除或修改操作。这类集合是固定大小的,任何试图改变其大小的操作都会抛出 UnsupportedOperationException

2.2 使用默认的接口方法实现

在自定义类中继承接口或抽象类时,如果未重写某些方法并直接调用父类或接口的默认实现,这些方法可能会抛出 UnsupportedOperationException,表明该操作未被支持或实现。

2.3 误用某些 API

有些 Java API 的设计本意是提供只读视图或不可修改的集合。对这些集合的修改操作都会导致 UnsupportedOperationException

3. 解决方案

3.1 使用支持修改的集合实现

如果需要对列表进行添加或删除操作,确保使用支持修改的集合实现,如 ArrayListHashMap 等。

示例代码:
import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Main {    public static void main(String[] args) {        List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "orange"));        list.add("pear"); // 成功添加元素        System.out.println(list); // 输出: [apple, banana, orange, pear]    }}

3.2 替换不可变集合

如果操作不可变集合时抛出异常,可以使用 Collections.unmodifiableList() 来创建不可变集合,以确保集合不会被无意修改。

示例代码:
import java.util.ArrayList;import java.util.Collections;import java.util.List;public class Main {    public static void main(String[] args) {        List<String> mutableList = new ArrayList<>();        mutableList.add("apple");        mutableList.add("banana");        List<String> unmodifiableList = Collections.unmodifiableList(mutableList);                // 下面的行将抛出 UnsupportedOperationException        // unmodifiableList.add("orange");                System.out.println(unmodifiableList); // 输出: [apple, banana]    }}

3.3 自定义类中正确实现接口方法

在实现接口或继承抽象类时,确保所有必须的方法都已正确实现,并且不要直接调用父类或接口中的默认方法,除非你确定这些方法支持当前操作。

示例代码:
import java.util.AbstractList;import java.util.List;public class CustomList extends AbstractList<String> {    private final List<String> internalList;    public CustomList(List<String> list) {        this.internalList = list;    }    @Override    public String get(int index) {        return internalList.get(index);    }    @Override    public int size() {        return internalList.size();    }    @Override    public boolean add(String s) {        return internalList.add(s);    }        // 可根据需要实现其他方法}

3.4 使用工具类创建可变集合

对于需要从数组或不可变集合生成可变集合的情况,可以使用 new ArrayList<>(...) 或类似构造方法来创建新的可变集合。

示例代码:
import java.util.ArrayList;import java.util.List;public class Main {    public static void main(String[] args) {        List<String> immutableList = List.of("apple", "banana", "orange"); // Java 9+        List<String> mutableList = new ArrayList<>(immutableList);        mutableList.add("pear"); // 成功添加元素        System.out.println(mutableList); // 输出: [apple, banana, orange, pear]    }}

4. 预防措施

理解集合的特性:在使用集合时,理解它们的特性,特别是哪些集合是不可变的,哪些是可修改的。慎用Arrays.asList():在需要可修改的列表时,尽量不要直接使用Arrays.asList()返回的列表,转而使用new ArrayList<>(Arrays.asList(...))避免调用不支持的操作:在自定义类中实现接口或继承抽象类时,避免调用父类或接口中的默认实现,确保所有方法都按照预期工作。使用单元测试:通过单元测试验证代码的正确性,特别是在涉及集合操作时,确保不会抛出意外的UnsupportedOperationException

5. 总结

java.lang.UnsupportedOperationException 是由于试图执行当前对象不支持的操作而引发的异常。通过理解集合的特性、使用正确的集合实现、自定义类中正确实现接口方法,并进行充分的测试,可以有效地解决和避免该异常的发生。本文提供了多种解决方案和实用建议,帮助开发者快速定位并解决UnsupportedOperationException问题。希望本文对您有所帮助,如有其他问题,欢迎讨论!


点击全文阅读


本文链接:http://zhangshiyu.com/post/179479.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 进错房,嫁给八零最牛特种兵已完结(林晚夏江肆年)抖音热文_《进错房,嫁给八零最牛特种兵已完结》最新章节免费在线阅读 -
  • 重生后选魔族,天族哭着求我当王全章节(月沁雪任意)全文免费阅读无弹窗大结局_(重生后选魔族,天族哭着求我当王全章节)重生后选魔族,天族哭着求我当王全章节免费阅读全文最新章节列表_笔趣阁(重生后选魔族,天族哭着求我当王全章节) -
  • 捡回摄政王后,她在皇室作威作福完结版小说(景飞鸢赵灵杰)全文免费阅读无弹窗大结局_(捡回摄政王后,她在皇室作威作福完结版免费阅读全文大结局)最新章节列表_笔趣阁(捡回摄政王后,她在皇室作威作福完结版) -
  • 千金难泣(立轩苏子骞翠竹吴进)全本免费在线阅读_千金难泣最新章节在线阅读(立轩苏子骞翠竹吴进)
  • 《沈云阶傅宴辞》(沈云阶傅宴辞》已完结完整版全集大结局小说)全文阅读笔趣阁
  • 《沈凌峰沈国华》已完结小说全文阅读笔趣阁《沈凌峰沈国华》
  • 《傅嫤韩恬魏郯程茂》已完结(傅嫤韩恬魏郯程茂)热门小说全目录完整版)全文阅读笔趣阁
  • 八零俏军医错嫁糙汉军官:番外+全文+后续(贺昭朗孟翩然)完本小说免费_全本免费小说八零俏军医错嫁糙汉军官:番外+全文+后续最新小说全文阅读(贺昭朗孟翩然)
  • 失去千千万万遍在线阅读(阮相宜陆凛言)全文免费阅读无弹窗大结局_(失去千千万万遍在线阅读)失去千千万万遍在线阅读免费阅读全文最新章节列表_笔趣阁(失去千千万万遍在线阅读) -
  • 脱离世界后,妻子疯了火爆小说小说(沈夕颜林程言)全文免费阅读无弹窗大结局_(脱离世界后,妻子疯了火爆小说免费阅读全文大结局)最新章节列表_笔趣阁(脱离世界后,妻子疯了火爆小说) -
  • 跨年发生踩踏,男友为救白月光丢下我(温林初宝宝)免费阅读 -
  • 都重生了,还不离婚等啥呢宋招弟霍文铮小说在线章节免费阅读

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1