android报错之ConcurrentModificationException

使用环境:

无意间使用了一个增强for循环,遍历知己之后判断另一个数组中是否包含,如果包含就删除使用了增强for循环的那个列表

for(String p : phones){
    if (p.contains(res)) {
        phones.remove(p);
        Log.e("log","包含同样数据的是==》"+ p);
    }
    Log.e("log","不包含同样数据的是==》"+ p);
}
这样做结果ConcurrentModificationException

根据网上前辈的资料:http://blog.csdn.net/aaawqqq/article/details/43884623

讲的是因为你遍历了自己,然后通过判断删除自己,导致了这个报错。

解决的方法是
  将需要遍历的那个数组赋值给另一个同类型的数组,然后遍历那个数组,之后将遍历过的数组在赋值给原来的数组。

思路很简单,但是需要知道是为什么。


List ps = phones;
for(String p : ps){
    if (p.contains(res)) {
        phones.remove(p);
        Log.e("log","包含同样数据的是==》"+ p);
    }
    Log.e("log","不包含同样数据的是==》"+ p);
}

但是还有一个问题,如果字符串过长,而且字符串毕竟只有0--9这几个,如果包含就删除,一次性讲究全部删除完了。

所以,上面的代码在特定情况下就是扯淡!很扯淡!

如果需要删除的话,就需要唯一性!  就是你要删除的那个字串所有 的元素包括标点都是其他item里没有的,才可以使用上面的方法。

所以,如果需要走上面的思路,需要做一些更精准的考虑:

if (res.length() == 10) {
    List ps = phones;
    for (String p : ps) {
        String str = p.substring(p.length() - 1, p.length());
        p = p.substring(0, p.length() - 1);
        if (p.equals(res)) {
            phones.remove(p + str);
            Log.e("log", "包含同样数据的是==》" + p + str);
        } else {
            Log.e("log", "不包含同样数据的是==》" + p + str);
        }
    }
}else{
    Log.e("log","小于10位");
}

这样判断,意思是如果字符串的长度 == 10 ,就将需要遍历的数组A 赋值给B,然后将B遍历。

我的字符串就是电话号码,所以一旦开始删除,十一位的号码就剩下十位了。

而B数组中的号码还是11位,对号码进行截取前十位,对比判断,如果包含就删除。


如果字符串低于10位,就不做判断 。


到这明白一个事情,就是为什么会抱这个错,因为我在判断数组B中的元素是否包含字符串res的时候,数组B就是数组A中有多个元素都是包含,所以判断一次,删除了很多。

这样是不合理的,因为我想要的就是只删除一次。而且是精准删除!

如果电话号码前十位都是相同的 ,那么,这一删可是删掉了全部!

而且,项目会直接崩掉。


当然,谁会没事输入两个前十位号码都一样的手机号码,然后点删除输入框里 的数据?这几率很低,但是还存在。

所以用了一个很不要脸的方法,当输入框里输入的电话号码超过十位就是十一位的时候,让整个输入框失去焦点。

如果用户还需要输入的活着做修改,那就点击删除再输入一次。这样,如果还能错了我就真不知道怎么搞。


关于这个报错有什么不明白的,请联系我 QQ 532245792  




你可能感兴趣的:(日记)