java.lang.UnsupportedOperationException异常

今天在启动tomcat的时候,在日志里发现一个异常

java.lang.UnsupportedOperationException异常

意思是在SecurityFilter 这个类里面第69行 destroy这个方法报出的异常,根据网上搜索到的回答:

因为调用Arrays.asLisvt() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList。remove,add等 方法在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList 重写这些method来对list进行操作,但是Arrays$ArrayList没有override remove(int),add(int)等,所以throw UnsupportedOperationException。

看截图AbstractList

java.lang.UnsupportedOperationException异常

但是我在SecurityFilter 发现 69行destroy 虽然调用clear方法,并没有涉及到remove,为啥remove 的时候报异常,而且这个两个句柄并定义为Arraylist,应该不会涉及上面说的问题

java.lang.UnsupportedOperationException异常

     我仔细想想,既然调用父类AbstractList的方法,根据继承的原则

       当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法

      意思是当超类(这里说的是父类AbstractList)的引用对象,引用子类(ArrayList)的时候,调用谁的方法不是由超类的引用类型来决定的,而是由子类类型型决定的,而且子类中的方法在父类中被定义过。

    所以这里在过滤器被初始化 init的时候肯定使用了asLisvt方法,我发现在init方法里面有一个convStrToList方法

java.lang.UnsupportedOperationException异常

我进去一看发现convStrToList调用asList方法 导致返回的类型不是Arraylist。

java.lang.UnsupportedOperationException异常