Java中快速失败指的是什么意思

  介绍

这篇文章主要介绍了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中快速失败指的是什么意思