版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 异常处理,1,2,主要内容,6.1 异常处理概述 什么是异常 为何采用异常处理 6.2 异常的分类与层次 6.3 异常的处理机制 对异常处理的进一步讨论 小结 作业,3,错误与异常,按照错误的性质分类: 语法错:是由于违反Java的语法规则而产生的错误,只要没有编译错误,才可生成字节码。 语义错(运行错):程序在语法上正确,但在语义上存在错误,如输入数据格式错、除数为0错、给变量赋值超出其允许范围等,这类错误只能在运行时发现,有的还需进行异常处理。 逻辑错:程序编译通过,也可运行,但运行结果与预期不符。如由于循环条件不正确而没有结果,循环次数不对等因素导致的计算结果不正确等。只有凭借经
2、验排查。 异常(exception) :在程序运行中由代码产生的一种错误。,java中的异常处理,4,6.1 异常处理概述,6.1.1 什么是异常 异常就是在程序的运行过程中所发生的意外事件,它中断指令的正常执行。 Java中提供了一种独特的处理异常的机制,通过异常来处理程序设计中出现的错误。 没有处理错误的程序: read-file openTheFile; determine its size; allocate that much memory; closeTheFile; ,5,6.1.2 为何使用异常处理,把出错处理和正常代码分开。比如有程序是处理文件,大家看流程,这个流程中充满了错
3、误可能。 readFile 打开文件;打不开咋办? 判断大小;大小判断失败怎么办?(磁带) 分配内存;内存不够 读入内存;文件读不出来 关掉文件; 文件关不掉。 解决方法:写大量的if语句。,6,传统的错误检测和纠正,errorCodeType readFile initialize errorCode = 0; 打开文件; if (打开文件成功) 判断文件长 if (文件长取到) 分配内存 if (分内存成功) 读入内存 if (读文件失败) errorCode = -1; /读文件判断 else errorCode = -2; /分配内存失败 else errorCode = -3; /取
4、不到文件长 关闭文件; if (文件没关 ,7,从上面的流程可看出真正有用的代码不多,就五条而已,其它全部是判断错误用的,主要逻辑都被错误处理代码混得看不清了;程序可读性差;出错返回信息量太少;只把能够想到的错误考虑到,对以外的情况无法处理。 在Java中,处理这种情况的方法是利用异常处理,把出错处理和正常代码分开,Java异常处理通过5个关键字try,catch,finally,throw和throws进行管理。,8,在一个方法的运行过程中,如果发生了异常,则这个方法(或者是Java虚拟机)生成一个代表该异常的对象(包含了该异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处
5、理这一异常。通常把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。 运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止,这个过程称为捕获(catch)一个异常 如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。,9,就比如购买某件电子产品,使用过程中出现了故障,交由售后处理(抛出异常),售后根据客户提供的错误情况,去故障手册查找相应的错误所属,交由相应的维修人员处理(捕获异常),找到原因和解决方法,反馈给客户。,10,Java的解决方式,readFile /结构清楚,无需自己判断
6、,代码量小。 try 打开文件; 判断大小; 分配内存; 读入内存; 关掉文件; catch (文件打开失败) 处理代码; catch (大小取不到失败) 处理代码; catch (内存分配失败) 处理代码; catch (读取失败) 处理代码; catch (文件关闭失败) 处理代码; ,11,和传统的方法比较异常的优点:,1.把错误代码从常规代码中分离出来 2. 把错误传播给调 用堆栈 3. 按错误类型和 错误差别分组 4. 系统提供了对于一些无法预测的错误的捕获和处理 5. 克服了传统方法的错误信息有限的问题,12,6.2 异常类的分类与层次,6.2.1 异常类的层次结构 在jdk中,每
7、个包中都定义了异常类,而所有的异常类都直接或间接地继承于java.lang.Throwable类。当Java程序遇到不可预料的错误时,会实例化一个从Throwable类继承的对象。,13,异常类的结构层次,14, Error: 错误Error类指的是系统错误或运行环境出现的错误,这些错误一般是很严重的错误,即使捕捉到也无法处理,由Java虚拟机生成并抛出,包括系统崩溃、动态链接失败、虚拟机错误等,在Java程序中不做处理。 Exception: 异常Exception类则是指一些可以被捕获且可能恢复的异常情况,是一般程序中可预知的问题。,15,对于异常可分为两类: (1) 运行时异常:由系统检
8、测, ,该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也依然可以成功编译,因为它是在程序运行时才有可能产生,比如除0异常,系统将它们交给缺省的异常处理程序.但是应通过调试程序尽量避免而不是使用try-catch-finally语句去捕获它。 (2) 非运行时异常:在程序中必须对其进行处理,否则编译器会指出错误。Java编译器要求Java程序必须捕获或声明所有的非运行时异常,如I/O操作中的异常,16,异常的分类,.,Throwable,Error,Exception,RuntimeException,缺省的异常 处理程序,由用户捕获或 声明并处理,不做处理,用户自己产生的异常,要处
9、理,17,6.2.2 Exception类,1. Exception类的构造方法 Exception类有两种构造方法: Exception():没有指定的消息串,直接构造一个Exception。 Exception(String exp):根据参数提供的消息串,创建一个Exception。 例如,创建一个异常对象: Exception myExp=new Exception(“异常!”);,18,2. 常用方法 Exception类的方法均继承自Throwable类,可以为程序提供一些有关异常的信息,常用方法如下: String getMessage() :返回该异常所存储的描述性字符串。 S
10、tring toString():返回异常对象的详细信息,包含该类名和指出所发生问题的描述性消息的字符串。 void printStackTrace():将异常发生的路径,即引起异常的方法调用嵌套序列打印到标准错误流。 例如: System.out.println(myExp.getMessage(); 此语句可以将异常对象myExp的异常信息描述打印输出,在屏幕上显示“异常!”。,19,6.2.3 自定义异常类,在程序中,可以创建自定义的异常类。用户定义的异常必须继承自Throwable或Exception类,建议用Exception类. 用户定义的异常同样要用try-catch捕获,但必须
11、由用户自己抛出 throw new MyException. 可按照下面的方法自定义一个异常类: (1) 创建一个继承Exception类或者其它已存在的异常类的子类。 (2) 在该类中创建一个默认的无参数构造方法,该构造方法以适当的错误消息作为输入,调用它的超类的构造方法。 (3) 再增加一个带字符串参数的构造方法,该构造方法以适当的错误消息作为输入(还包括输入的字符串)来调用其超类相应的构造方法。,20,例如,定义一个继承于Exception类的用户自定义异常类,语句如下: class MyException extends Exception MyException() super(“数
12、据错误!”); MyException(String exp) super(exp); ,21,6.3 异常的处理机制,每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。这就是Java的异常处理机制。,22,Java中处理异常有两种方式:捕获异常、声明抛出异常。 捕获异常,就地解决,并使程序继续执行。属于现场解决问题的方式。使用trycatchfinally结构对异常
13、进行捕获和处理。 声明抛出异常,也就是将异常向外转移,即将异常抛出方法之外,由调用该方法的环境去处理。属于非现场方式,把异常交由专门的机构处理(异常处理函数或异常处理类)的方式。通过throws和throw抛出异常。,23,6.3.1 捕获异常,当Java运行时系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。这是积极的异常处理机制。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。,24,捕获异常是通
14、过try-catch-finally语句实现的。,捕获并处理异常 try /接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理 catch(要处理的异常种类和标识符) /处理异常 catch(要处理的异常种类和标识符) /处理异常 finally /最终处理 ,25,try-catch-finally语句,1. try 捕获异常的第一步是用try选定捕获异常的范围,所有可能抛出异常的语句都放入try模块中。 try模块中的语句是程序正常流程要执行的语句,但是在执行过程中有可能出现异常。 2. catch(必有) 每个try代码块可以伴随一个或多个catch语句,用于处理try
15、代码块中所生成的异常事件。catch语句只需要一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛弃的异常对象传递给catch块。,26,try-catch-finally语句,在catch块中是对异常对象进行处理的代码,与访问其它对象一样,可以访问一个异常对象的数据成员或调用它的方法。 getMessage( )是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。 例如:,27,try-catch-finally语句,try
16、. catch( FileNotFoundException e )System.out.println( message: +e.getMessage() );e.printStackTrace( System.out ); catch( IOException e )System.out.println(e.getMessage() ); catch(Exception e )System.out.println(e.getMessage() );,28,try-catch-finally语句,catch 语句的顺序:捕获异常的顺序和catch语句的顺序有关,当捕获到一个异常时,剩下的ca
17、tch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。,29,try-catch-finally语句,3.finally(可选)捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。Case:例6.1 TryCatchSequence.java,30,Case:例6.1 TryCatchSequence.java,31,Case:例6.1 TryCat
18、chSequence.java,32,Case:例6.1 TryCatchSequence.java,【程序解析】 编译后在命令行状态执行,第一次执行未带有任何参数,则args0不存在,程序执行到b=Integer.parseInt(args0)语句时,发生数组下标越界异常,系统自动抛出ArrayIndexOutOfBoundsException异常,并退出try语句块,后面的语句不会被执行,该异常被第一个catch块捕获并处理,输出异常名及其发生的路径。最后执行finally语句块。 第二次执行参数为0,则args0获得值“0”,执行b=Integer.parseInt(args0)语句不会
19、产生异常,并使b=0,当执行c=a/b语句时,由于除数为0,产生算术运算异常,系统自动抛出Arithmetic- Exception异常,后面的语句不会被执行,退出try语句块,该异常被第二个catch块捕获并处理,输出异常名及其发生的路径。最后执行finally语句块。 第三次执行参数为5,此程序执行时不会产生任何异常,执行完try语句块中的所有语句之后,执行finally语句块。,33,常见的异常,ArithmeticException ArrayIndexOutOfBandsException ArrayStoreException IOException FileNotFoundExc
20、eption NullPointerException MalformedURLException NumberFormatException OutOfMemoryException,如果在使用能够产生异常的方法而没有捕获和处理,将不能通过编译,34,6.3.2 声明抛出异常,1. 抛出异常 在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。 2. 声明抛出异常 一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明抛出异常(throws).声
21、明抛出异常是一种消极的异常处理机制。,35,1. 抛出异常,抛出异常就是产生异常对象的过程,首先要生成异常对象,异常由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。 系统生成的异常一般被Java运行时系统自动抛出,由Java系统监测,在程序中使用try-catch块进行捕获,此种方式也称隐式抛出。 异常也可在方法中显式抛出,即手工抛出,尤其是用户自定义异常必须由用户自己抛出。显式抛出异常对象是通过throw语句实现的。,36,1. 抛出异常,显式抛出异常对象是通过throw语句实现的。 例如, 显式抛出系统定义异常: IOException e = new IOException()
22、; throw e ; / 显式抛出输入输出异常 抛出自定义异常对象: throw new myException(出现异常!);,37,可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误,因为String类不是Throwable类的直接或间接子类: throw new String(want to throw); 在同一个方法中抛出异常和处理异常。 Case:例6.2 SeqStack.java,38,2. 声明抛出异常,如果在一个方法中生成了一个异常,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃异常,使得异常对象
23、可以从调用栈向后传播,直到有合适的方法捕获它为止。 也就是说抛出异常的方法和处理异常的方法不是同一个方法时,则需声明抛出异常。 用方法声明中的throws子句指明。例如:public int read () throws IOException.,39,throws子句中同时可以指明多个异常,之间由逗号隔开。例如: public static void main(String args) throws IOException, IndexOutOfBoundsException Case: 例6.3 SeqStack2.java,40,对异常处理的进一步讨论:,(1)对Error类或其子类的对象,程序中不必进行处理。 (2)对RuntimeException类或其子类,程序中可以不必进行处理。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年宁波中远海运物流有限公司招聘备考题库及答案详解1套
- 2026年佛山市顺德区伦教三洲幼儿园招聘备考题库附答案详解
- 2026年中国轻工业出版社有限公司招聘备考题库附答案详解
- 2026年定边县公开招聘展馆讲解员备考题库及答案详解参考
- 2026年天津人力资源开发服务有限公司招聘国有大型银行派遣制客服代表备考题库含答案详解
- 2026年大连理工大学化工学院党群办公室职员(自聘)招聘备考题库完整答案详解
- 2025年凤台十中高中部选调教师备考题库及一套参考答案详解
- 2026年北京京西门城基础设施投资建设有限公司招聘备考题库及答案详解1套
- 2026年体育总局科研所体育服务检验中心检验检测工作岗位编外聘用人员招聘备考题库及一套参考答案详解
- 2026年宁波市象山县商贸集团有限公司公开选聘国有企业工作人员岗位调整备考题库及参考答案详解
- 船厂装配工基础知识培训课件
- 2025年GMAT逻辑推理解析试题
- 2025-2026学年苏教版(2024)小学数学二年级上册(全册)教学设计(附目录P226)
- 2025-2030电子特气行业纯度标准升级对晶圆制造良率影响深度分析报告
- 除夕年夜饭作文600字9篇范文
- 国企公房管理办法
- 公共政策概论-004-国开机考复习资料
- 空调售后维修管理制度
- 建筑装饰装修施工图设计说明
- 2025年河北石家庄印钞有限公司招聘13人笔试参考题库附带答案详解
- 《幼儿园保育教育质量评估指南》解读与培训
评论
0/150
提交评论