异常处理集合框架_第1页
异常处理集合框架_第2页
异常处理集合框架_第3页
异常处理集合框架_第4页
异常处理集合框架_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

异常处理、结合框架目标理解异常的概念 运用try块、catch块和finally块处理异常运用多重catch块处理异常运用嵌套try/catch块处理异常运用关键字throw和throws处理异常集合框架的理解Set、list、map异常的概念异常:应用程序在运行过程中出现的错误或非正常的意外情况,即虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误。原因:数组下标越界;控指针的访问;试图读取不存在的文件,数学除零等异常处理机制由编译器强制执行Java编译器要求方法必须声明抛出可能发生的非运行时异常,但并不要求必须声明抛出未捕获的运行时异常。完全不出错是不可能的,不要刻意回避,要多想意外发生后如何去处理它!异常的概念为什么用异常:运行时发生的错误如果没有异常处理机制,程序将会终止并使所有已分配资源的状态保持不变,这样会导致资源泄露。如:不能收回某个程序分配的内存,以供其它程序使用。什么是异常publicclassExceptionRaised{publicExceptionRaised(){}publicintcalculate(intoperand1,intoperand2){intresult=operand1/operand2;returnresult;}publicstaticvoidmain(String[]args){ExceptionRaisedobj=newExceptionRaised();intresult=obj.calculate(9,0);System.out.println(result);}}OS!异常情况异常程序突然终止并将控制交给操作系统在运行时发生的错误异常的分类在Java语言中,“异常”可以看作是一个类,异常类的根是Throwable。Throwable是类库java.lang包中的一个类,并派生出Exception类和Error类两个子类异常类的结构:Throwable|____Error|____Exception|____RuntimeException|____其它Exception

Error:Java运行系统中的内部错误以及资源耗尽的情况。

Exception:RuntimeException及其子类(编程导致的异常)、其它Exception类。异常的分类Error体系:

Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。Exception体系包括RuntimeException体系和其他非RuntimeException的体系:RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。Java异常类

文件结束

EOFException找不到文件I/O异常的根类

IOException数字转化格式异常,比如字符串到float型数字的转换无效

NumberFormatException不能加载所需的类

ClassNotFoundException方法接收到非法参数

IllegalArgumentException数组大小小于或大于实际的数组大小

ArrayIndexOutOfBoundException尝试访问null对象成员

NullPointerException许多java.lang异常的基类

RuntimeException异常层次结构的根类

Exception算术错误情形,如以零作除数

ArithmeticException线程中断

InterruptedException说明异常异常的捕获对于异常有两种处理方法:

要么捕获异常。通过trycatch方法,catch子句中放置处理异常的语句。要么声明异常,也就是在方法名后面加上throwsExceptionname,...,

方法本身只是抛出异常,由函数调用者来捕获异常。

Java程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。对于RuntimeException,通常不需要我们去捕获,这类异常由Java运行系统自动抛出并自动处理。异常的捕获手动引发异常指定由方法引发的异常tryfinallycatchthrowsthrow处理异常要监控的程序语句包含在此块中以合理的方式捕获和处理异常释放资源等try和catch块trycatch异常执行catch后程序继续正常运行程序控制引发代码块单元try和catch块演示:示例1try和catch块的用法classExceptionRaised{/**构造方法.*/publicExceptionRaised(){}/***这个方法运行时将会产生一个异常.*@paramoperand1除法中的分子*@paramoperand2除法中的分母*@returnint返回除法的结果*/publicintcalculate(intoperand1,intoperand2){intresult=operand1/operand2;returnresult;}}publicclassArithmeticException{/**构造方法.*/publicArithmeticException(){}publicstaticvoidmain(String[]args){ExceptionRaisedobj=newExceptionRaised();try{/*定义变量result以存储结果.*/intresult=obj.calculate(9,0);System.out.println(result);}catch(Exceptione){System.err.println(“发生异常:"+e.toString());e.printStackTrace();}}}嵌套try-catch块有时块的一部分导致一个错误,而块本身也可能导致一个错误,必须将一个异常嵌套在另一个异常处理机制中从内层try语句寻找与异常匹配的catch语句,如无,检查下一个,从里到外,直到最后一个catch嵌套try–catch块

如果内层try没有相应的catch,则检查外层catchclassNestedException{protectedNestedException(){}publicvoidtest(String[]argumnet){try{intnum=Integer.parseInt(args[1]);/*嵌套try块。*/try{intnumValue=Integer.parseInt(args[0]);System.out.println(“args[0]+“的平方是"+numValue*numValue);}catch(NumberFormatExceptionnb){System.out.println(“不是一个数字!");}}catch(ArrayIndexOutOfBoundsExceptionne){System.out.println(“请输入数字!!!");}}/**main方法*/publicstaticvoidmain(String[]args){NestedExceptionobj=newNestedException();obj.test(args[0]);}}因此需要嵌套异常处理程序!!多重catch块一段代码可能会生成多个异常当引发异常时,会按顺序来查看每个catch

语句,并执行第一个类型与异常类型匹配的语句执行其中的一条catch语句之后,其他的catch语句将被忽略

try{…….}catch(ArrayIndexOutOfBoundsExceptione){……}catch(Exceptione){……}多重catch块使用多重catch语句时,异常子类一定要位于异常父类之前,否则,控制权将永远传不到子类,将产生一个不能到达的代码,即产生错误

try{…...}catch(Exceptione){……}catch(ArrayIndexOutOfBoundsExceptione){……}

×finally块finally是java异常处理提供的另一个关键字,通俗的说finally是异常处理语句结构的一部分,表示无论什么情况都要执行的模块。finally语句的主要作用是在try或catch转到其他部分前做的一些“善后”工作。比如:关闭打开的文件,释放链接、内存等系统资源。

finally语句的执行是一种无条件的操作,无论在哪种异常下都会执行,即使try或catch模块中有continue、return、break等关键字,或者是有throw语句,程序都会执行finally语句。有时需要清理代码,但程序已经停止运行,使用finally块可使程序不管发生什么异常都将执行每个try语句至少有一个catch子句或finally子句finally块try块finally块catch块无异常异常try、catch和finally块的执行流程try{ //要监控错误的代码块methodGeneratingException();}catch(Exceptione){ //Exceptione

的异常处理程序}finally{ //在try结束前要执行的代码块cleanup();}异常的抛出

throws语句

throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的异常的类型。

throw语句

throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句throws关键字throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。如下面例子publicclassShoot{staticvoidpop()throwsNegativeArraySizeException{//定义方法并抛出NegativeArraySizeException异常int[]arr=newint[-3];//创建数组}publicstaticvoidmain(String[]args){try{ pop();//调用pop()方法}catch(NegativeArraySizeExceptione){

System.out.println("pop()方法抛出的异常");//输出异常信息}}}使用throw语句3throw异常引发的异常!停止异常处理程序可执行程序语句语句1语句2throw和throws总结

throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;

throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后再将包装后的异常信息抛出。对异常处理方式不同.throws对异常不处理,谁调用谁处理,throws的Exception的取值范围要大于方法内部异常的最大范围,而catch的范围又要大于throws的Exception的范围;throw主动抛出自定义异常类对象.throws抛出的是类,throw抛出的是对象.throw语句用在方法体内,表示抛出异常,由方法体内的语句处理throws语句用在方法声明后面,表示再抛出异常,由调用这个方法的上一级方法中的语句来处理throws主要是声明这个方法会抛出这种类型的异常,使其他地方调用它时知道要捕获这个异常。throw是具体向外抛异常的动作,所以它是抛出一个异常实例。throw和throws总结throws说明你有哪个可能,倾向throw的话,那就是你把那个倾向变成真实的了同时:throws出现在方法函数头;而throw出现在函数体;throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常;两者都是消极处理异常的方式(这里的消极并不是说这种)优点和传统的方法比较异常的优点:把错误代码从常规代码中分离出来把错误传播给调用堆栈按错误类型和错误差别分组系统提供了对于一些无法预测的错误的捕获和处理克服了传统方法的错误信息有限的问题method1method2method3method4产生异常传递处理异常为什么用集合不知道存放对象的个数与数组相比更加实用灵活更加面向对象集合简介 在常见用法中,集合(collection)和数学上直观的集(set)的概念是相同的。集是一个唯一项组,也就是说组中没有重复项。实际上,“集合框架”包含了一个Set接口和许多具体的Set类。但正式的集概念却比Java技术提前了一个世纪,那时英国数学家GeorgeBoole按逻辑正式的定义了集的概念。大部分人在小学时通过我们熟悉的维恩图引入的“集的交”和“集的并”学到过一些集的理论。集的基本属性如下:集内只包含每项的一个实例集可以是有限的,也可以是无限的可以定义抽象概念体系结构

·Set接口继承Collection,但不允许重复,使用自己内部的一个排列机制。

·List接口继承Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。

·Map接口是一组成对的键-值对象,即所持有的是key-valuepairs。Map中不能有重复的key。拥有自己的内部排列机制。关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。

Java2简化集合框架图Collection接口Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。Collection在前面的大图也可以看出,它是List和Set的父类。并且它本身也是一个接口。它定义了作为集合所应该拥有的一些方法。如下:注意:集合必须只有对象,集合中的元素不能是基本数据类型。Collection接口支持如添加和除去等基本操作。设法除去一个元素时,如果这个元素存在,除去的仅仅是集合中此元素的一个实例。集合中的方法boolean

add(Objectelement)boolean

remove(Objectelement)Collection接口还支持查询操作:intsize()boolean

isEmpty()boolean

contains(Objectelement)Iterator

iterator()组操作:Collection接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于整个集合的任务。boolean

containsAll(Collectioncollection)boolean

addAll(Collectioncollection)voidclear()voidremoveAll(Collectioncollection)voidretainAll(Collectioncollection)containsAll()方法允许您查找当前集合是否Set接口扩展Collection接口不允许重复元素不区分顺序允许包括null的元素,但是最多只能有一个(HashSet)对add()、equals()和hashcode()方法添加了限制HashSet和TreeSet是Set的实现HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet

set接口API图set迭代器迭代器是一种设计模式,它是一个对象,它可以遍历并选择集合中的对象,而开发人员不需要了解该集合的底层结构。Java中的Iterator功能比较简单,只能单向移动使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。使用next()获得序列中的下一个元素。使用hasNext()检查序列中是否还有元素。使用remove()将迭代器所指向的集合删除元素。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

List接口List接口继承了Collection接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。面向位置的操作包括插入某个元素或Collection的功能,还包括获取、除去或更改元素的功能。在List中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置:

相关方法:voidadd(intindex,Objectelement):在指定位置index上添加元素element

boolean

addAll(intindex,Collectionc):将集合c的所有元素添加到指定位置indexObjectget(intindex):返回List中指定位置的元素int

indexOf(Objecto):返回第一个出现元素o的位置,否则返回-1int

lastIndexOf(Objecto):返回最后一个出现元素o的位置,否则返回-1Objectremove(intindex):删除指定位置上的元素Objectset(intindex,Objectelement):用元素element取代位置index上的元素,并且返回旧的元素

List接口ArrayList类ArrayList是List接口的大小可变数组的实现。允许包括null在内的所有元素。每个ArrayList

实例都有一个容量。该容量是用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList

中不断添加元素,其容量也自动增长。Array大致上等同于Vector类,除了此类是不同步的。如果多个线程同时访问一个ArrayList

实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。集合框架的优点提供一组可用的集合接口提供有效的数据结构和算法可以方便地扩展或改写集合接口的实现都是可交换的使设计新API的工作降到最少接口和算法的可重用性Map集合

首先要知道的是Map接口并不是继承Collection接口。在JAVA2的集合框架中,主要包括两个接口及其扩展和实现类,即Collection接口和Map接口。两者的区别在于前者存储一组对象,我们已经学习过了;而后者Map接口则用于维护键/值对(key/valuepairs)。 举个例子如:现实中我们把每个人的个人信息和他的社会安全号(相当于身份证号)进行关联。社会安全号是关键字,而个人信息就是对应的人映射到的值。理解什么是键/值映射对学习起Map集合就很容易了。 下面我们来看一下Map接口中定义的公共方法,Map接口为我们提供了完成下面三种主要功能的方法:

Map集合Objectput(Objectkey,Objectvalue)

将互相关联的一组键/值对放入该映像。如果该关键字已经存在,那么与此关键字相关的新值将取代旧值。方法返回关键字的旧值,如果关键字并不存在,则返回null。Objectremove(Objectkey)

从映像中删除与key相关的映射voidputAll(Mapt)

将来自特定映像的所有元素添加给该映像voidclear()

从映像中删除所有映射Objectget(Objectkey)

获得与关键字key相关的值,并且返回与关键字key相关的对象,如果没有在该映像中找到该关键字,则返回null。boolean

containsKey(Objectkey)

判断映像中是否存在关键字key。Map集合boolean

containsValue(Objectvalue)

判断映像中是否存在值value。intsize() 返回当前映像中映射的数量。boolean

isEmpty() 判断映像是否为空。SetkeySet()

返回映像中所有关键字的视图集。Collectionvalues()

返回映像中所有值的视图集。SetentrySet()

返回Map.Entry对象的视图集,即映

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论