今天在启动tomcat的时候,在日志里发现一个异常
意思是在SecurityFilter 这个类里面第69行 destroy这个方法报出的异常,根据网上搜索到的回答:
因为调用Arrays.asLisvt() 方法 ,返回的是java.util.Arrays$ArrayList对象, 而不是ArrayList对象。Arrays$ArrayList和ArrayList都是继承AbstractList。AbstractList中的remove,add等方法都是默认throw UnsupportedOperationException。而ArrayList 自己重写了这些方法,但是Arrays$ArrayList没有重写 remove(int),add(int)等方法,所以调用asLisv 后,如果调用remove(int),add(int)等方法,其实是java.util.Arrays$ArrayList对象在调用 remove(int),add(int)等方法,也就是在调用父类AbstractList中的这些方法。
看截图AbstractList
但是我在SecurityFilter 发现 69行destroy 虽然调用clear方法,并没有涉及到remove,为啥remove 的时候报异常,而且这个两个句柄并定义为Arraylist,应该不会涉及上面说的问题
我仔细想想,既然调用父类AbstractList的方法,根据继承的原则
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法
意思是当超类(这里说的是父类AbstractList)的引用对象,引用子类(ArrayList)的时候,调用谁的方法不是由超类的引用类型来决定的,而是由子类类型型决定的,而且子类中的方法在父类中被定义过。
所以这里在过滤器被初始化 init的时候肯定使用了asLisvt方法,我发现在init方法里面有一个convStrToList方法
我进去一看发现convStrToList调用asList方法 导致返回的类型不是Arraylist。