`
ssun125
  • 浏览: 45018 次
文章分类
社区版块
存档分类
最新评论

list操作 出UnsupportedOperationException异常

 
阅读更多

这两天遇见的问题,感觉说的对,纠结半天了

我们在使用collection框架code时,会时常遇到UnsupportedOperationException异常,有些人很不了解为什么抛出这个异常,会很郁闷,但是那些只知道code的代码工人不会想这些问题。下面我作一下解释,可能也不是很正确。其实我们主要的疑惑可能是:java既然提供了这个方法,为什么我们调用要抛出异常,说不支持这个操作。我们先看一段代码:

 List list1 = new ArrayList();
 list1.add("test");
 String[] array = new String[2];
 List list2 = Arrays.asList(array);
 List list3 = new ArrayList(list2);
 list3.add("test");
 array[0] = "test2";
 System.out.println(list2.get(0));
 list2.add("test");//抛出异常
在执行到l2.add("test")时抛出如下异常:

test2
Exception in thread "main" java.lang.UnsupportedOperationException
 at java.util.AbstractList.add(AbstractList.java:151)
 at java.util.AbstractList.add(AbstractList.java:89)
 at TesException.main(TesException.java:20)

为什么会这样呢?

解释如下:

上面代码中list1是用正常方式下创建的List,可以增删内容

而 list2是一个固定大小的List,不可以对其进行进行修改操作,对array的任何操作,若想修改list3的内容,只能通过修改其对应的 array,从上面这一点也是可以看出的(关于这些解释可以参看api文档)。那么为什么会这样呢,其实List结构按是否可修改也是可以在分为两个类型 的,但是collection框架已经有太多的接口类型了,若在对每种接口类型都分出一个unmodifiable类型的接口,那么最后 collection框架会更大,对于学习与使用都会需要记住更多的接口。所以我想这样做的关键一点是:统一接口,减少开发人员的负担。但是若文档中没有对这一点说清楚,有些喜欢刨根问题的程序员会很郁闷。

我 猜测Arrays.asList返回的List内容是Array的内容引用。若可以在List中修改,那么怎么同步呢?因为它们有一个本质的区别 Array不能自动增大,若允许在List随便增大,则与其相应的Array的内容怎么保证不可修改呢?他们之间有一个阻抗。最后权衡一下,只能让 Arrays.asList返回的List不可修改,或者让返回的List与Array之间没有关系,若这样的话,对于那些很大数组来说性能上就会很有影 响。

分享到:
评论

相关推荐

    java.lang.UnsupportedOperationException异常(csdn)————程序.pdf

    这个异常通常在尝试调用一个不支持的操作时抛出。在Java编程中,某些方法可能在特定对象或特定条件下不支持某个操作,当尝试执行这些操作时,就会抛出此异常。 在给定的描述中,问题出在MyBatis框架的使用上。...

    java 操作错误(UnsupportedOperationException)

    在Java编程语言中,`UnsupportedOperationException` 是一个标准的运行时异常,通常在不支持特定操作的情况下抛出。这个错误通常表明某个方法被调用,但该方法在当前上下文中并未实现或者不适用。让我们深入了解一下...

    java.lang.UnsupportedOperationException(解决方案).md

    UnsupportedOperationException异常产生的原因,通常是因为我们在不可修改的集合对象上执行了添加、删除等操作。例如,在Java中,Arrays.asList()返回的列表是固定大小的,不允许添加或删除元素,尝试这样做就会抛出...

    com.avr.exception.UnsupportedOperationException解决方案(亲测可用).md

    很多集合类框架中的接口都有固定的实现约束,比如AbstractList的add和remove方法就总是抛出UnsupportedOperationException异常。 第三步,解决该问题通常需要在代码层面进行调整。如果开发者使用的是自定义类,可能...

    UnsupportedOperationException(解决方案).md

    通过捕获UnsupportedOperationException异常,开发者可以在异常发生时进行适当的处理,例如采用其他排序方法,如Collections.sort()。 在实际开发中,了解各个集合类的特性和限制是非常重要的。这可以帮助开发者...

    UnsupportedOperationException如何解决.md

    在Java编程中,UnsupportedOperationException是一种运行时异常,通常表示尝试执行的操作不被支持。这种情况通常出现在使用集合框架时,特别是在尝试对某些集合进行不支持的操作时。解决这类问题的关键在于理解异常...

    不支持的操作异常(解决方案).md

    1. 异常类型:UnsupportedOperationException(不支持的操作异常)。这是一种在Java中常见的运行时异常,它属于RuntimeException的子类。当调用的方法不被支持时,会抛出此异常。 2. 异常场景:在上述例子中,不...

    高效安全的Immutable List好处.docx

    Immutable List 是一种特殊的列表数据结构,它遵循不可变对象的原则,即一旦创建,其内容就不能进行添加、删除或修改操作。这种设计模式在多线程环境和安全性需求较高的场景下非常有用,因为它天然具备线程安全性和...

    详解Java 集合类 List 的那些坑

    详解 Java 集合类 List ...List 并不是我们常用的 java.util.ArrayList,而是 Arrays 的静态内部类 java.util.Arrays.ArrayList,该类继承自抽象类 java.util.AbstractList,但没有实现 add 方法,默认抛出 java.lang_...

    Java集合List与Array的相互转换

    3. 在处理`Arrays.asList()`返回的List时,避免调用添加、移除或清空元素的方法,以免抛出异常。 了解这些知识点后,你将在Java编程中更自如地处理集合与数组之间的转换,提高代码的灵活性和效率。

    Java 实例 - 只读集合源代码+详细指导教程.zip

    这些方法返回的集合在尝试进行添加、删除或替换元素操作时会抛出`UnsupportedOperationException`。 例如,创建一个只读ArrayList的代码如下: ```java List<String> readOnlyList = Collections.unmodifiableList...

    java-collection-all-in-one.pdf

    asList方法是Arrays类的一个静态方法,用于将数组转换为List视图,但它不支持添加、删除或修改操作,因为它们会抛出UnsupportedOperationException异常。ArrayList的复制可以通过构造函数、addAll方法、Collections....

    浅谈Arrays.asList() 和ArrayList类型区别

    由于这个内部类没有实现List接口的所有方法,因此,如果尝试对这个List进行添加、删除或修改元素的操作,程序会抛出UnsupportedOperationException异常。 例如,下面的代码会导致运行时错误: ```java list.add(...

    阿里巴巴编码规范试题答案

    答案:在Java中,Arrays.asList方法的返回值是一个固定大小的列表,不能进行add、remove、clear操作,否则将抛出UnsupportedOperationException异常。 八、 阿里巴巴编码规范 阿里巴巴编码规范是阿里巴巴集团内部...

    java集合代码

    4. **`UnsupportedOperationException`**: 如果我们尝试对不可变的集合或不支持特定操作的集合执行某些操作(如`add()`或`remove()`),就会抛出这个异常。例如,尝试对由`Arrays.asList()`创建的固定大小的列表执行...

    javaclooections类.docx

    这些集合一旦创建后便无法再进行修改,试图添加元素将会抛出`UnsupportedOperationException`异常。例如: ```java List<String> s = Collections.emptyList(); s.add("hello"); // 抛出...

    阿里开发规范(集合与并发处理)

    **强制规定**:通过 `Arrays.asList()` 方法将数组转换为集合时,不应使用集合的修改方法(如 `add`, `remove`, `clear`),因为这些方法会抛出 `UnsupportedOperationException` 异常。 **说明**:`Arrays.asList`...

    Java编程中常见的坑

    如果尝试修改该集合,将会抛出`UnsupportedOperationException`。 将集合转换回数组时,应使用`toArray()`方法。需要注意的是,无参数的`toArray()`方法返回的是`Object[]`类型,如果想要转换为其他类型的数组,...

    ErrUnsupportedOperation(解决方案).md

    例如,给定一个使用`final`关键字声明的列表对象`finalList<String> myList`,如果尝试使用`add`方法向其中添加元素,就会抛出`UnsupportedOperationException`。正确的做法是不使用`final`关键字声明这个列表,或者...

Global site tag (gtag.js) - Google Analytics