美文网首页
UnsupportedOperationException

UnsupportedOperationException

作者: CZKGO | 来源:发表于2019-11-14 22:29 被阅读0次

问题

java.lang.UnsupportedOperationException
        at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(CopyOnWriteArrayList.java:1111)
        at holy.bible.test.MainActivity.onCreate(MainActivity.java:35)
        at android.app.Activity.performCreate(Activity.java:7149)
        at android.app.Activity.performCreate(Activity.java:7140)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1288)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3027)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3182) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1916) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6898) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

原因

    根据堆栈信息可知,该错误是由于执行了CopyOnWriteArrayList子类COWIterator的remove方法产生的,代码如下:

List<String> list;
list = AnalysisDataManger.getInstance().getRuleList();
if(list==null||list.size() == 0){
    list = new ArrayList<>();
    list.addAll(getDefaultList());
}
final Iterator<String> each = list.iterator();
while (each.hasNext()) {
    if (getWhiteList().contains(each.next())) {
        each.remove();
    }
}

    在上面代码中,通过AnalysisDataManger.getInstance().getRuleList()获得的列表为了线程安全,其类型为CopyOnWriteArrayList,所以报错

解决方案

    AnalysisDataManger.getInstance().getRuleList()中牵扯太多,不方便改动,这里就改动上面展示代码,将CopyOnWriteArrayList列表整体添加到ArrayList列表里

List<String> list = new ArrayList<>();
if(AnalysisDataManger.getInstance().getRuleList()!=null){
    list.addAll(AnalysisDataManger.getInstance().getRuleList());
}
if (list.size() == 0) {
    list.addAll(getDefaultList());
}
final Iterator<String> each = list.iterator();
while (each.hasNext()) {
    if (getWhiteList().contains(each.next())) {
        each.remove();
    }
}

    这里的改动方式值适用于当前逻辑,如果外部的列表也需要CopyOnWriteArrayList来保证线程安全,请另行处理

相关文章

网友评论

      本文标题:UnsupportedOperationException

      本文链接:https://www.haomeiwen.com/subject/ewecictx.html