这篇文章主要介绍了Java中快速失败指的是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
<强> 01,前言强>
说起来真特么惭愧:十年它老兵,Java菜鸟一枚,今天我才了解到Java还有快速失败一说。不得不感慨啊,学习真的是没有止境。只要肯学,就会有巨多巨多别人眼中的“旧”知识涌现出来,并且在我这全是新的。
能怎么办呢?除了羞愧,就只能赶紧全身心地投入学习,把这些知识掌握。
为了镇楼,必须搬一段英文来解释一下快速失败。
在系统设计中,快速失败系统> public void 测试(Wanger 如一),{, ,if (wanger ==, null), { ,throw new  RuntimeException (“wanger 不能为空“); ,} , ,System.out.println (wanger.toString ()); }
一旦检测到如一为null,就立马抛出异常,让调用者来决定这种情况下该怎么处理,下一步wanger.toString()就不会执行了,避免更严重的错误出现,这段代码由于太过简单,体现不出来,后面会讲到。
瞧,快速失败就是这个鬼,没什么神秘的。如果大家源码看得比较多的话,这种例子多得就像旅游高峰期的人头。
然后呢,没了?三秒钟,别着急,我们继续。
<强> 02,每个中集合的删除操作强>
很长一段时间里,我都不明白为什么不能在每个循环里进行元素的去除。今天我们就来借机来体验一把。
List, list =, new ArrayList<在(); list.add(“沉默王二“); list.add(“沉默王三“); list.add(“一个文章真特么有趣的程序员“); for (String str :列表),{ ,if (“沉默王二“.equals (str)), { ,list.remove (str); ,} } System.out.println(列表); 这段代码看起来没有任何问题,但运行起来就糟糕了。
Exception 拷贝thread “main" java.util.ConcurrentModificationException 美元,at java.util.ArrayList Itr.checkForComodification (ArrayList.java: 909) 美元,at java.util.ArrayList Itr.next (ArrayList.java: 859) ,at com.cmower.java_demo.str.Cmower3.main (Cmower3.java: 14)为毛呢?
<强> 03,分析问题的杀手锏强>
这时候就只能看源码了,ArrayList。java的909行代码是这样的。
final void checkForComodification (), { if 才能;(modCount !=, expectedModCount) ,,,throw new ConcurrentModificationException (); }也就是说,删除的时候执行了checkForComodification方法,该方法对modCount和expectedModCount进行了比较,发现两者不等,就抛出了ConcurrentModificationException异常。
可为什么会执行checkForComodification方法呢?这就需要反编译一为每个那下段代码了。
List, list =, new ArrayList (); list.add(“沉默王二“); list.add(“沉默王三“); list.add(“一个文章真特么有趣的程序员“); Iterator var3 =, list.iterator (); while (var3.hasNext ()), { ,String str =,(字符串),var3.next (); ,if (“沉默王二“.equals (str)), { ,list.remove (str); ,} } System.out.println(列表); 原来为每个是通过迭代器迭代器配合而循环实现的。
1) ArrayList.iterator()返回的迭代器其实是ArrayList的一个内部类Itr。
public Iterator, Iterator (), { return 才能;new  Itr (); } Itr实现了迭代器接口。
private class Itr implements Iterator, { int 才能;游标;,,,,//,index of next element 用回报 int 才能;lastRet =, 1,,//, index of last element 回来了,,1,if no 等 int 才能;expectedModCount =, modCount; Itr才能(),{} public 才能;boolean  hasNext (), { ,,,return cursor !=,大小; ,,} @SuppressWarnings才能(“unchecked") public 才能;E next (), { ,,,checkForComodification (); ,,,int 小姐:=,光标; ,,,对象[],elementData =, ArrayList.this.elementData; ,,,if (小姐:祝辞=,elementData.length) ,,,,,throw new ConcurrentModificationException (); ,,,cursor =,小姐:+,1; ,,,return (E), elementData [lastRet =,我]; ,,} } Java中快速失败指的是什么意思