如何从java.util.List中删除元素?

10

每次我使用java.util.List的.remove()方法时,都会出现UnsupportedOperationException错误。这让我很疯狂。将其转换为ArrayList并没有帮助。如何解决?

@Entity
@Table(name = "products")
public class Product extends AbstractEntity {

    private List<Image> images;

    public void removeImage(int index) {
         if(images != null) {
            images.remove(index);
         }
    }
}

堆栈跟踪:

java.lang.UnsupportedOperationException
java.util.AbstractList.remove(AbstractList.java:144)
model.entities.Product.removeImage(Product.java:218)
    ...

我发现我需要使用比List接口更精确的类,但是在ORM示例中到处都是使用List...


你正在使用哪个List实现,堆栈跟踪应该很明显。 - Peter Lawrey
看起来你正在使用一些ORM。你可能需要查阅它的文档以确定正确的操作方式。 - Matthew Flaschen
你确定你的列表有条目吗?使用remove()应该是正确的方法。请发布完整的堆栈跟踪,也许其中还有更多信息。 - oezi
3个回答

23

不幸的是,并非所有列表都允许您删除元素。根据 List.remove(int index) 的文档:

从此列表中删除指定位置的元素(可选操作)

除了创建一个具有与原始列表相同元素的新列表并从该新列表中删除元素之外,您无法做太多事情。就像这样:

public void removeImage(int index) {
     if(images != null) {
        try {
            images.remove(index);
        } catch (UnsupportedOperationException uoe) {
            images = new ArrayList<Image>(images);
            images.remove(index);
        }
     }
}

6
不错的回答(+1),但我想质疑“不幸”这个词。我认为某些列表是不可变的是一种特性。 - Sean Patrick Floyd
2
@Seanizer,嘿嘿,我同意你的观点!对于OP来说,这还是不幸吧 ;) - aioobe
1
@aioobe: 但是List是一个接口...这意味着如果我们为一个具体类实现这个接口,我们必须实现所有的方法...在这种情况下,怎么可能是可选的:“并非所有的列表都允许您删除元素”...那么在这种情况下,它会故意抛出“UnsupportedOperationException”吗? - Arun
1
没错。根据文档,throw new UnsupportedOperationException()List.remove 的有效实现。 - aioobe
我唯一的“改进”是将方法返回一个图像,这样合约就类似于List(返回已删除的项或如果未找到则返回null)。 - hfontanez
该方法的签名已在问题中给出。 - aioobe

7

这意味着底层的List实现不支持删除操作。

注意:List不必是ArrayList,它可以是任何实现,有时甚至是自定义的。


2
将列表转换为数组列表不会改变任何事情,对象本身仍然是列表,因此您只能使用列表属性。您应该尝试使用新的ArrayList来创建它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接