java.lang.UnsupportedOperationException异常

今天在启动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。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值