繁体   English   中英

在Java 8中遇到-JDK-8023339:在抛出java.lang.UnsupportedOperationException时,juArrays.asList()。removeIf()是“懒惰的”

[英]Encountered in Java 8 - JDK-8023339 : j.u.Arrays.asList().removeIf() is “lazy” in throwing java.lang.UnsupportedOperationException

第一次使用Java 8时,我遇到了此错误 有人也遇到过吗? 错误被标记为已解决,但是我不确定为什么会得到它。 我还摘录了错误中列出的示例代码,并获得了UOE。 这是我的环境:

VM x64中的操作系统

$ cat /etc/lsb-release
DISTRIB_ID="elementary OS"
DISTRIB_RELEASE=0.2.1
DISTRIB_CODENAME=luna
DISTRIB_DESCRIPTION="elementary OS Luna"

JDK

$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
$ javac -version
javac 1.8.0_25

这是我的测试

package test;

import org.junit.Test;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

public class RemoveIfTest {
    static interface I {
        // i want to remove this
        public void a();

        public String b();
    }

    @Test(expected = UnsupportedOperationException.class)
    public void test() {
        List<Method> methods = Arrays.asList(I.class.getMethods());

        // what we have
        methods.forEach(m -> System.out.println(m));
        // output: public abstract void test.RemoveIfTest$I.a()
        //         public abstract java.lang.String test.RemoveIfTest$I.b()

        // old way
        for (Method method : methods) {
            if (method.getReturnType().equals(Void.TYPE)) {
                System.out.println("Remove this > " + method);
            }
        }
        // output: Remove this > public abstract void test.RemoveIfTest$I.a()

        // got UOE
        methods.removeIf(m -> m.getReturnType().equals(Void.TYPE));
    }
}

这是评估行的屏幕截图 调试时

高亮的行是它死的地方 调试时

Arrays.asList的Javadoc所述,它是由数组支持的固定大小的列表:

返回由指定数组支持的固定大小的列表。 (对返回列表的更改为“直写”到数组。)与Collection.toArray结合使用,此方法充当基于数组和基于集合的API之间的桥梁。 返回的列表是可序列化的,并实现RandomAccess。

查看java.util.Arrays的源代码,它返回其自己的List实现,该实现类似于java.util.ArrayList

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    ...
}

它不会覆盖AbstractListremove方法,您可以从源代码中看到它引发了此异常。

public E remove(int index) {
    throw new UnsupportedOperationException();
}

解决方案(如前所述)是使用支持删除的列表。

List<Method> methods = new ArrayList<>(Arrays.asList(I.class.getMethods()))

@JBNizet的回答。 谢谢。

// List methods = java.util.Arrays.ArrayList
List<Method> methods = Arrays.asList(I.class.getMethods())

 // List methods = java.util.ArrayList
 List<Method> methods = new ArrayList<>(Arrays.asList(I.class.getMethods()));

您应该检查您的列表,jdk1.8描述了throw,如果无法从此集合中删除元素,则throws的描述为“ UnsupportedOperationException。如果无法删除匹配的元素或通常不能删除,则实现可能会抛出此异常。支持的。” 我测试了这个列表,它是有效的。 此列表如下:

List<String> list=new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.removeIf(s->s.equals("1"));

所以,祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM