未获支持的操作只有在运行时候才能探测到,因此他们表示动态检查。java中有大量的动态检查机制提供这一特点。
最常见的未获支持操作。是由于容器的固定尺寸的数据结构支持。
下面看代码:
public class Unsupported { static void test(String msg, List<String> list){
System.out.println("-----"+msg+"-----");
Collection<String> c=list;
Collection<String> sublist=list.subList(1,8);
Collection<String> c2=new ArrayList<>(sublist); try{
c.retainAll(c2);
}catch (Exception e){
System.out.println("retainAll:"+e);
} try{
c.removeAll(c2);
}catch (Exception e){
System.out.println("removeAll:"+e);
} try{
c.clear();
}catch (Exception e){
System.out.println("clear:"+e);
} try{
c.add("X");
}catch (Exception e){
System.out.println("add:"+e);
} try{
c.addAll(c2);
}catch (Exception e){
System.out.println("addAll:"+e);
} try{
c.remove("c");
}catch (Exception e){
System.out.println("remove:"+e);
} try{
list.set(0,"X");
}catch (Exception e){
System.out.println("set:"+e);
}
} public static void main(String[] args){
List<String> list= Arrays.asList("A B C D E F G H I J K L".split(" ")); test("Modifiable Copy",new ArrayList<>(list)); test("Arrays.asList()",list); test("unmodifiableList()", Collections.unmodifiableList(new ArrayList<String>(list)));
}
}
-----Modifiable Copy-----
-----Arrays.asList()-----
retainAll:java.lang.UnsupportedOperationException
removeAll:java.lang.UnsupportedOperationException
clear:java.lang.UnsupportedOperationException
add:java.lang.UnsupportedOperationException
addAll:java.lang.UnsupportedOperationException
-----unmodifiableList()-----
retainAll:java.lang.UnsupportedOperationException
removeAll:java.lang.UnsupportedOperationException
clear:java.lang.UnsupportedOperationException
add:java.lang.UnsupportedOperationException
addAll:java.lang.UnsupportedOperationException
remove:java.lang.UnsupportedOperationException
set:java.lang.UnsupportedOperationException
因为Arrays.saList()生成一个List数值,它基于一个固定大小的数组,仅仅支持那些不会改变的数组大小进行操作。任何会引起底层数据结构的尺寸改变的修改都会产生一个异常,表示未获支持调用。