本篇文章给大家谈谈Java常见错误解析与解决策略,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
fail-fast
fail-fast机制是指如果在遍历集合的过程中发现集合发生了改变,就会抛出ConcurrentModificationException。通常有两种情况:
多线程的情况下,这个线程在遍历集合的同时修改了集合,其他线程在这个线程遍历集合的同时也修改了集合。
fail-fast的检测
以ArrayList代码为例。从代码中可以看出,expectedModCount被初始化为modCount,其中modeCount是ArrayList被修改(添加删除)的次数。迭代器next 和remove 接口将检查expectedModCount 和modCount 是否相等。如果它们不相等,就会抛出异常。
公共迭代器(){
返回新的Itr();
}
私有类Itr 实现Iterator{
protected int limit=ArrayList.this.size;
int 光标; //要返回的下一个元素的索引
int 最后Ret=-1; //返回的最后一个元素的索引; -1 如果没有这样的
int 预期ModCount=modCount;
公共布尔hasNext() {
返回游标限制;
}
@SuppressWarnings("未选中")
公共E下一个(){
if (modCount !=预期ModCount)
抛出新的ConcurrentModificationException();
}
公共无效删除(){
if (lastRet 0)
抛出新的IllegalStateException();
if (modCount !=预期ModCount)
抛出新的ConcurrentModificationException();
}
一个例子:
ArrayListlist=new ArrayList();
列表.add("A");
列表.add("B");
列表.add("C");
for (字符串str : 列表) {
列表.add("D");
}输出结果:
线程“主”中的异常java.util.ConcurrentModificationException
在java.util.ArrayList$Itr.checkForCommodification(ArrayList.java:901)
在java.util.ArrayList$Itr.next(ArrayList.java:851)
在TestJava.main(TestJava.java:14)
这里隐含着一个知识点。对于foreach循环,javac编译器实际上将其处理为迭代器迭代。
fail-safe
fail-safe该机制是指如果在集合遍历过程中发现集合发生了改变,那么集合仍然可以正常遍历。以CopyOnWriteArrayList为例:
公共迭代器(){
返回新COWIterator(getArray(), 0);
}
静态最终类COWIteratorimplements ListIterator{
/** 数组的快照*/
私有最终对象[]快照;
/** 后续调用next 将返回的元素索引。 */
私有int 游标;
COWIterator(Object[] elements, int initialCursor) {
光标=初始光标;
快照=元素;
}
//.
}
公共布尔添加(E e){
同步(锁){
Object[] 元素=getArray();
int len=elements.length;
Object[] newElements=Arrays.copyOf(elements, len + 1);
newElements[len]=e;
setArray(newElements);
返回真;
}
}
公共E 删除(int索引){
同步(锁){
Object[] 元素=getArray();
int len=elements.length;
E oldValue=get(元素, 索引);
int numMoved=len - 索引- 1;
if (numMoved==0)
setArray(Arrays.copyOf(元素, len - 1));
别的{
对象[] newElements=新对象[len - 1];
System.arraycopy(元素, 0, newElements, 0, 索引);
System.arraycopy(元素,索引+ 1,newElements,索引,
移动数);
setArray(newElements);
}
返回旧值;
}
}
最终无效setArray(Object[] a) {
元素=a;
}从代码中可以看到:iterator返回COWIterator,COWIterator实际上是遍历当前元素。每次都会将旧的元素复制到新的数组中,然后进行操作。
一个例子
CopyOnWriteArrayListlist=新的CopyOnWriteArrayList();
列表.add("A");
列表.add("B");
列表.add("C");
for (字符串str : 列表) {
System.out.print(str + "rn");
}输出结果为:
一个
乙
C
Java常见错误解析与解决策略的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、Java常见错误解析与解决策略的信息别忘了在本站进行查找哦。
【Java常见错误解析与解决策略】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这篇文章写得不错啊,让人感觉Java有点难懂的感觉。
有13位网友表示赞同!
我之前刚学java,遇到很多坑!文章挺有帮助的。
有14位网友表示赞同!
学习Java确实不容易,希望这个文章能帮到跟我一样挣扎的人!
有13位网友表示赞同!
哎,我也经常在Java代码里出错,不知道怎么回事。
有12位网友表示赞同!
感觉Java项目调试起来有点麻烦啊。
有12位网友表示赞同!
这篇文章提醒了我Java的一些注意点,我会注意避免这些问题!
有7位网友表示赞同!
JAVA真的是一个老牌语言了,虽然好用,但有时也跟不上时代节奏吧。
有13位网友表示赞同!
我更喜欢其他编程语言,Java感觉有些复杂。
有12位网友表示赞同!
学习编程需要不断坚持,希望大家学JAVA都能顺利!
有7位网友表示赞同!
文章写的很具体,很有针对性,尤其是对新手来说非常有用。
有7位网友表示赞同!
希望能有更多关于Java的文章分享,让我这入门者少走弯路!
有16位网友表示赞同!
Java的应用场景真的是太多了,学习它未来还是很有前景的。
有18位网友表示赞同!
学习java真是要费时间和精力啊,希望自己能克服困难!
有14位网友表示赞同!
感谢作者分享这种宝贵经验,对Java的理解更加深了。
有14位网友表示赞同!
文章分析的都挺准确的,以后写Java代码时我会注意这些问题!
有8位网友表示赞同!
看这篇文章后我感觉Java确实有它的难点,但还是值得学习的。
有16位网友表示赞同!
Java真的是一个应用范围很广的语言,学它总会有收获!
有20位网友表示赞同!
希望能看到更多案例分析,让我理解Java的应用更全面一些!
有7位网友表示赞同!
希望作者能分享更多关于Java的干货!
有14位网友表示赞同!