第一次使用Java 8,我遇到了这个bug。有没有遇到过这个? Bug被标记为已解决但是我不知道为什么我会得到它。我也在bug中找到了列出的示例代码并且确实获得了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));
}
}
这是评估线的截图
突出显示的行是死亡的地方
答案 0 :(得分:6)
由于Arrays.asList
的Javadoc声明它是由数组支持的固定大小列表:
返回由指定数组支持的固定大小的列表。 (改为 返回的列表&#34;通过&#34;到数组。)此方法充当 基于数组和基于集合的API之间的桥梁,结合起来 与Collection.toArray。返回的列表是可序列化的 实现RandomAccess。
查看java.util.Arrays
的来源,它会返回自己的List
实现,类似于java.util.ArrayList
。
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
...
}
它不会覆盖remove
中的AbstractList
方法,您可以从源中看到它抛出此异常。
public E remove(int index) {
throw new UnsupportedOperationException();
}
解决方案(如已经说明的那样)是使用支持删除的列表。
List<Method> methods = new ArrayList<>(Arrays.asList(I.class.getMethods()))
答案 1 :(得分:1)
来自@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()));
答案 2 :(得分:0)
你应该检查你的列表,jdk1.8描述了throws,throws的描述是“UnsupportedOperationException如果无法从这个集合中删除元素。如果匹配的元素无法删除或者通常情况下,实现可能会抛出此异常不支持删除。“ 我测试这个列表,这是工作。这个清单如下:
List<String> list=new ArrayList<String>();
list.add("1");
list.add("2");
list.removeIf(s->s.equals("1"));
所以,祝你好运。