《集合和异常处理课件.ppt》由会员分享,可在线阅读,更多相关《集合和异常处理课件.ppt(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、关于集合和异常处理关于集合和异常处理第1页,此课件共67页哦集合注意:不是所有的集合类都是从Collection继承第2页,此课件共67页哦集合接口(Conllection接口)第3页,此课件共67页哦集合接口(Map接口)第4页,此课件共67页哦集合框架第5页,此课件共67页哦集合有三种类型List:事物列表Set:唯一的事物列表Map具有唯一ID的事物第6页,此课件共67页哦List接口下的几个实现类ArrayList:一个可增长的数组,提供快速遍历和快速随机访问,当需要快速遍历时而不是做大量删除和插入时,用ArrayListVector(Hashtable)为了线程安全,Vector方法
2、被同步,通常使用ArrayList而不用Vector。ArrayList和Vector是唯一的两个设计了RadomAccess方法类第7页,此课件共67页哦Set接口下的几个实现类Set接口:重在数据的唯一性,不允许重复,set接口通过equals()方法确定两个对象是否相等,重复时只能有一个放在set中。Set的三种实现类HashSet:未排序、未分类的集合,不能重复插入值,不关心数据顺序时使用LinkedHashSet:一个排序,但未分类的集合,在元素之间使用一个双向链表来连接,当关心遍历顺序时使用LinkedHashSet,它将按插入的顺序进行遍历,当使用HashSet时遍历的顺序是不可
3、预知的。TreeSet:按照一种二叉树的结构进行存储,并可以保证遍历时,会按照元素的自然顺序进行排序。也可以自己构造一个TreeSet,让其按照自己的想法进行排序第8页,此课件共67页哦Map接口下的实现类Map接口:按“键值”对进行插入,(键、值都是对象)可以按照键来搜索值对象可以查找值的集合,也可以查找键的集合HashMap:一种未分类,未排序的映射类,不需要顺序时HashMap是一种最好的选择,因为其效率较高,HashMap允许集合中有一个null键和多个null值。Hashtable:Hashtable是HashMap的同步版本,但Hashtable不允许有任何的null存在。Link
4、edHashMap:和linkedHashSet一样,LinkedHashMap维护插入和访问的顺序,添加和删除比HashMap慢,但遍历的速度要更快。TreeMap:一个顺序的Map集合。第9页,此课件共67页哦集合函数集合的定义;-是将多个元素组成一个单元的对象.作用:-集合用于存储、检索和操作数据,以己将数据从一个方法传输至另一个方法。经常使用到的java.util包中的:ArrayList、LinkdList,、HashMap、Vector、List和Map等类和接口。第10页,此课件共67页哦ArrayList类的概念ArrayList对象:是长度可变的对象引用数组,用于创建动态数组
5、。它扩展AbstractList并实现List接口。三个之间的比较:List是有序的集合,可以包含重复的元素。AbstractList类实现List接口,有助随机方式访问元素。ArrayList在访问和遍历对象时,性能优。第11页,此课件共67页哦ArrayList类java.lang.Objectjava.lang.Object java.util.AbstractCollectionjava.util.AbstractCollection java.util.AbstractListjava.util.AbstractList java.util.ArrayListjava.util.Ar
6、rayList 第12页,此课件共67页哦ArrayList特性ArrayList支持按照需要增长的动态数组。在java中,标准数组是固定长度的,数组创建以后,不能增长或者收宿。而arrarylist可以动态增减大小,数组列表初始长度超过时,集合自动增长;当删除时,集合自动变小。第13页,此课件共67页哦ArrayList类优点每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。第14页,此课件共67
7、页哦ArrayList类构造方法构造方法构造方法:ArrayList()构造一个初始容量为 10 的空列表。ArrayList(Collectionc)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。ArrayList(intinitialCapacity)构造一个具有指定初始容量的空列表。第15页,此课件共67页哦ArrayList类常用方法常用方法常用方法:常用方法:boolean addadd(Ee)将指定的元素添加到此列表的尾部。void addadd(intindex,Eelement)将指定的元素插入此列表
8、中的指定位置。Void clearclear()移除此列表中的所有元素。void trimToSizetrimToSize()将此ArrayList实例的容量调整为列表的当前大小。E setset(intindex,Eelement)用指定的元素替代此列表中指定位置上的元素。第16页,此课件共67页哦ArrayList类常用方法常用方法boolean removeremove(intindex)移除此列表中指定位置上的元素。boolean removeremove(Objecto)移除此列表中首次出现的指定元素(如果存在)。int sizesize()返回此列表中的元素数Boolean isE
9、mptyisEmpty()如果此列表中没有元素,则返回 true E getget(intindex)返回此列表中指定位置上的元素。void ensureCapacityensureCapacity(intminCapacity)如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。第17页,此课件共67页哦ArraryList示例:ArrayListls=newArrayList();ls.add(a);ls.add(b);ls.add(c);ls.add(d);ls.add(2,4);ls.get(2);ls.trimToSize();ls.se
10、t(1,haocai);ls.ensureCapacity(6);ls.isEmpty();ls.removeAll(ls);/removeRange(1,3);ls.remove(3);ls.clear();System.out.println(ls.get(4);System.out.println(ls.isEmpty();System.out.println(ls);第18页,此课件共67页哦ArrayList类ArrayListls=newArrayList();t3b=newt3();ls.add(C);ls.add(F);ls.add(E);ls.add(D);ls.add(b)
11、;ls.remove(4);System.out.println(ls.size();System.out.println(ls);第19页,此课件共67页哦Vector类java.util 类类 Vectorjava.lang.Objectjava.util.AbstractCollectionjava.util.AbstractListjava.util.Vector第20页,此课件共67页哦Vector类Vector类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector的大小可以根据需要增大或缩小,以适应创建Vector后进行添加或移除项的操作。
12、第21页,此课件共67页哦Vector类常用的方法voidaddElement(Eobj)将指定的组件添加到此向量的末尾,将其大小增加1。voidinsertElementAt(Eobj,intindex)将指定对象作为此向量中的组件插入到指定的index处。EelementAt(intindex)返回指定索引处的组件。booleancontains(Objecto)如果此向量包含指定的元素,则返回true。StringtoString()返回此向量的字符串表示形式,其中包含每个元素的String表示形式。第22页,此课件共67页哦Vector类常用的方法Eset(intindex,Eelem
13、ent)用指定的元素替换此向量中指定位置处的元素。Eremove(intindex)移除此向量中指定位置的元素。intindexOf(Objecto)返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回-1。第23页,此课件共67页哦Vector类常用的方法Eset(intindex,Eelement)用指定的元素替换此向量中指定位置处的元素。Eremove(intindex)移除此向量中指定位置的元素。intindexOf(Objecto)返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回-1。第24页,此课件共67页哦Enumeration类Enume
14、ration是一个接口类,它提供了一种访问各种数据结构中的所有数据抽象机制,就是我们要访问各种数据结构中的所有元素时,都可以使用同样方式,调用同样的方法。实现Enumeration接口的对象,它生成一系列元素,一次生成一个。第25页,此课件共67页哦Enumeration类boolean hasMoreElementshasMoreElements()测试此枚举是否包含更多的元素。空是返回false,则ture;EnextElementnextElement()如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素,取出保存对象。第26页,此课件共67页哦Enumeration类示例
15、Vector v=new Vector();v.addElement(“a”);v.addElement(“b”);第27页,此课件共67页哦Iterator迭代器集合通常,有许多情况需要遍历集合中的元素,例如显示集合中的每一个元素。一种遍历方法是使用迭代器(iterator),它是实现iterator或者ListIterator接口的一个对象。使用迭代器能够在集合中遍历以获得或者删除元素.第28页,此课件共67页哦Iterator迭代器对collection进行迭代的迭代器。迭代器取代了JavaCollectionsFramework中的Enumeration。迭代器与枚举有两点不同:迭代器
16、允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection移除元素。方法名称得到了改进。第29页,此课件共67页哦Iterator迭代器的方法方法:方法:boolean hasNexthasNext()如果仍有元素可以迭代,则返回true。E nextnext()返回迭代的下一个元素。void removeremove()从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。第30页,此课件共67页哦Iterator常用类演示/数组迭代Iteratoritr=al.iterator();/如果仍有元素可以迭代,则返回true/循环while(itr.ha
17、sNext()/对象,返回迭代的下一个元素。Objectelement=itr.next();/打印System.out.print(element);第31页,此课件共67页哦HashSet类java.util类HashSetjava.lang.Object java.util.AbstractCollection java.util.AbstractSet java.util.HashSet 此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。第32页,此课件共67页哦HashSet类方法in
18、t size()返回此set中的元素的数量(set的容量)。boolean add(Ee)如果此set中尚未包含指定元素,则添加指定元素。void clear()从此set中移除所有元素。Boolean isEmpty()如果此set不包含任何元素,则返回true。第33页,此课件共67页哦HashSet类方法示例HashSeths=newHashSet();hs.add(ok);hs.remove(ok);System.out.print(hs.size();System.out.print(hs);第34页,此课件共67页哦Hashtable类java.util类Hashtablejava
19、.lang.Object java.util.Dictionary java.util.Hashtable 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。第35页,此课件共67页哦Hashtable类如果很多条目要存储在一个Hashtable中,那么与根据需要执行自动rehashing操作来增大表的容量的做法相比,使用足够大的初始容量创建哈希表或许可以更有效地插入条目。初始容量主要控制空间消耗与执行rehash操作所需要的时间损耗之间的平衡。如果初始容量大于Hashtable所包含的最大条目数除以加载因子,则永远不会发生rehash操作。但是,将初始容
20、量设置太高可能会浪费空间。第36页,此课件共67页哦Hashtable类方法V put(Kkey,Vvalue)将指定key映射到此哈希表中的指定value。Enumerationkeys()返回此哈希表中的键的枚举。int size()返回此哈希表中的键的数量。String toString()返回此Hashtable对象的字符串表示形式,其形式为ASCII字符,(逗号加空格)分隔开的、括在括号中的一组条目。Object.hashCode()返回一个叫闪列码的值。第37页,此课件共67页哦Hashtable类方法实例Hashtableht=newHashtable();ht.put(okok
21、,newDouble(12.33);System.out.print(ht);第38页,此课件共67页哦properties类Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。因为Properties继承于Hashtable,所以可对Properties对象应用put和putAll方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是String的项。相反,应该使用setProperty方
22、法。如果在“不安全”的Properties对象(即包含非String的键或值)上调用store或save方法,则该调用将失败。类似地,如果在“不安全”的Properties对象(即包含非String的键)上调用propertyNames或list方法,则该调用将失败。第39页,此课件共67页哦properties类void load(Readerreader)按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。void store(OutputStreamout,Stringcomments)以适合使用load(InputStream)方法加载到Properties表中的格式,将此P
23、roperties表中的属性列表(键和元素对)写入输出流。第40页,此课件共67页哦properties类方法演示Propertiessets=newProperties();trysets.store(newFileOutputStream(d:a.txt),ThisProgramisused:);sets.put(saa,newInteger(3421);System.out.print(sets);catch(Exceptione)e.printStackTrace();第41页,此课件共67页哦什么是异常?什么是异常?异常类通常用来定义程序所遇到的轻微异外。可以写代码来处理异常并继续程
24、序执行,而不是让程序中断。例如:发生下列情况时,会出现异常:想打开的文件不存在网络连接中断受控操作数超出预定范围非常感兴趣地正在装载的类文件丢失第42页,此课件共67页哦7.4异常关系图第43页,此课件共67页哦异常机制有什么作用?异常机制有什么作用?在程序中发生错误时,发现错误的方法能抛出一个异常到其调用程序。然后,调用方法捕获该异常,以一定的方法处理异常并继续程序执行。这个方案给程序员一个写处理程序的选择,来处理异常。它为系统和用户之间提供了一种友好的交互方式。第44页,此课件共67页哦异常分类异常分类第45页,此课件共67页哦实例实例 1./HelloWorld程序版本的简单扩展程序版本
25、的简单扩展2.publicclassHelloWorld3.publicstaticvoidmain(Stringargs)4.inti=0;5.Stringgreetings=Helloworld!,6.No,Imeanit!,HELLOWORLD!;7.while(i4)8.System.out.println(greetingsi);9.i+;10.11.12.第46页,此课件共67页哦Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。RuntimeExceptionRuntimeException表示一种设计或实现问题,即如果程
26、序运行正常,从不会发生的情况(比如刚才的数组越界)。IOException表示输入输出过程中出现的异常分类说明分类说明第47页,此课件共67页哦运行结果运行结果编译执行,输出结果如下:Helloworld!No,Imeanit!HELLOWORLD!java.lang.ArrayIndexOutOfBoundsException:atHelloWorld.main(HelloWorld.java:12)原因:原因:当i=3是,按照循环中的规定,要输出的greetings3不存在,超出了数组的边界,因而产生异常。第48页,此课件共67页哦异常处理异常处理 Java编程语言提供了一个来考虑哪个异常
27、被抛出以及如何来恢复它的机制。try和catch语句调用栈机制 finally语句 重访前例第49页,此课件共67页哦try和catch语句try/可能抛出异常的代码段;catch(MyExceptionTypee)/处理一个特殊的异常;catch(Exceptione)/处理一个普通的异常;将能够抛出异常的代码放入try块中,然后创建相应的catch块的列表。如果生成的异常与catch中提到的相匹配,catch条件的块语句就被执行。在try块之后,可能有许多catch块,每一个都处理不同的异常。一定要将特殊的异常写在前面。第50页,此课件共67页哦调用栈机制调用栈机制 如果方法中的一个语句抛
28、出一个没有在相应的try/catch块中处理的异常,那么这个异常就被抛出到调用方法中。如果异常也没有在调用方法中被处理,它就被抛出到该方法的调用程序。这个过程要一直延续到异常被处理。如果一直到main()中仍没有被处理,那么该异常就中断程序的执行。第51页,此课件共67页哦main()上抛异常first()上抛异常second()总经理(问题解决不了)部门经理(问题解决不了)办事员一个事例对照一个事例对照第52页,此课件共67页哦finally语句 try/可能出现异常的代码段;finally/总是执行的代码段;finally语句定义一个总是执行的代码块,而不考虑异常是否被捕获。即使try代码
29、块和catch块中使用return语句退出当前方法或break跳出某个循环,finally代码块都要执行。Finally中的代码块不能被执行的唯一情况是:在被保护代码块中执行了System.exit(0)第53页,此课件共67页哦/对前面一个HelloWorld程序的补充,加入了异常处理部分publicclassHelloWorld2publicstaticvoidmain(Stringargs)inti=0;Stringgreetings=Helloworld!,No,Imeanit!,HELLOWORLD!;while(i4)trySystem.out.println(greetingsi
30、);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(Re-settingIndexValue);finallySystem.out.println(Thisisalwaysprinted);i+;改进前面的例子改进前面的例子 第54页,此课件共67页哦Helloworld!ThisisalwaysprintedNo,Imeanit!ThisisalwaysprintedHELLOWORLD!ThisisalwaysprintedRe-settingIndexValueThisisalwaysprinted执行结果执行结果第55页
31、,此课件共67页哦处理或声明规则处理或声明规则 当一个方法出现问题时程序员可以采取以下两种措施:通过将try和catch()块纳入其代码中,在这里捕获给被命名为属于某个超类的异常,并调用方法处理它。即使catch块是空的,这也算是处理情况。让被调用的方法表示它将不处理异常,而且该异常将被抛回到它所遇到的调用方法中。它是通过throws关键字来声明的,其格式如下:publicvoidtroublesome()throwsIOException第56页,此课件共67页哦Throws例子publicclassTestExceptionpublicstaticvoidmain(Stringargs)t
32、ryintreslut=newTest().devide(3,0);System.out.println(theresultis+reslut);catch(Exceptione)System.out.println(e.getMessage();System.out.println(programisrunninghere,thatisnormal!);classTestpublicintdevide(intx,inty)throwsExceptionintresult=x/y;returnx/y;第57页,此课件共67页哦创建自己的异常创建自己的异常 用户定义异常是通过扩展Exceptio
33、n类来创建的。它包含一个构造函数、几个变量以及方法;使用语句来抛出已经创建的异常:thrownewMyException();第58页,此课件共67页哦classIllegalValueExceptionextendsExceptionclassUserTrialintval1,val2;publicUserTrial(inta,intb)val1=a;val2=b;voidshow()throwsIllegalValueExceptionif(val10)thrownewIllegalValueException();System.out.println(value1=+val1);Syst
34、em.out.println(value2=+val2);第59页,此课件共67页哦publicclassThrowExamplepublicstaticvoidmain(Stringargs)UserTrialvalues=newUserTrial(-1,1);tryvalues.show();catch(IllegalValueExceptione)/e.printStackTrace();System.out.println(非法值);第60页,此课件共67页哦实例实例(定义一个叫MyException异常)publicclassMyExceptionextendsExceptionpr
35、ivateintnum;/当前错误号publicstaticfinalintDATA_FORMATERR=100;/定义常量publicMyException(intnum)this.num=num;publicStringgetMessage()Stringmsg=null;switch(num)caseDATA_FORMAT_ERR:msg=数据格式错误;break;default:msg=未知错误;returnmsg;第61页,此课件共67页哦抛出该异常的方法publicvoidmethodMe()throwsMyException/if有错误thrownewMyException(10
36、0);第62页,此课件共67页哦方法重写中的异常处理在方法的重写过程中,重写方法不能抛出比被重写方法范围更大的异常类型,否则就和java继承机制矛盾了见例子第63页,此课件共67页哦异常处理原则1、异常类是刻画非正常情况的工具,不能用于程序流程控制2、为异常类提供细致而完善的文档说明3、异常对象要完整的保留异常发生现场信息4、避免过大的try语句块5、按具体情况处理异常在异常处理中不要提供空的异常处理逻辑,这等于不对异常进行处理。可以通过printStackTrace来打印异常信息或者通过throw语句将异常抛出给当前方法的调用者;或干脆直接使用throws语句,将异常留给代码的调用者处理第6
37、4页,此课件共67页哦练习1编写一个程序,使用集合存储客户的邮件地址。地址中应该包含姓名,街道,市(县),省(自治区),国家(地区)然后显示集合中的内容;要求使用对象数组和至少两种集合对象来实现此程序的输出结果如下:姓名:李四街道:南山市(县):深圳省(自治区):广东国家(地区):中国*姓名:张三街道:南山市(县):南昌省(自治区):江西国家(地区):中国*姓名:王五街道:布吉市(县):深圳省(自治区):广东国家(地区):中国第65页,此课件共67页哦练习练习21、对此段程序增加异常处理importjavax.swing.JOptionPane;publicclassTryCatchpublicstaticvoidmain(Stringargs)while(true)Strings=JOptionPane.showInputDialog(input);intintValue=100;intValue=Integer.parseInt(s);intresult=10/intValue;System.out.println(intValue);2、声明一个大小为100的数组,随机插入1-100之间不重复的数第66页,此课件共67页哦感谢大家观看第67页,此课件共67页哦
限制150内