




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章第九章 异常处理机制异常处理机制本章目标本章目标1. 理解掌握异常的概念与异常类的层次结构理解掌握异常的概念与异常类的层次结构2. 理解掌握异常的产生和常见的异常类理解掌握异常的产生和常见的异常类3. 理解掌握异常处理机制和理解掌握异常处理机制和try-catch-finally语句语句4. 掌握自定义异常类掌握自定义异常类第第9 9章章 异常处理机制异常处理机制学习指南学习指南仔细阅读本章各知识点的内容仔细阅读本章各知识点的内容, 深刻理深刻理解解 java 语言中独特的例外处理机制,掌语言中独特的例外处理机制,掌握处理问题的方法握处理问题的方法,多练习,多上机多练习,多上机异常处理机
2、制是异常处理机制是java语言处理程序错语言处理程序错误的一种独特的机制,也是误的一种独特的机制,也是java语言中语言中一个难点一个难点9.1 9.1 异常处理知识异常处理知识设计程序时产生错误是不可避免的,一般计算机会设计程序时产生错误是不可避免的,一般计算机会给出信息,但不提供善后处理给出信息,但不提供善后处理java引进引进异常处理机制异常处理机制,使用户可以控制意外,提,使用户可以控制意外,提供适当的处理,从而大大提高了软件的可靠性供适当的处理,从而大大提高了软件的可靠性 9.1.1 错误错误程序错误有三种:程序错误有三种:编译错误编译错误运行错误运行错误逻辑错误逻辑错误9.1 9.
3、1 异常处理知识异常处理知识1. 编译错误编译错误 在编译程序时产生错误在编译程序时产生错误 没有编译错误是每个程序可正常运行的基本条件,因为没有编译错误是每个程序可正常运行的基本条件,因为只有编译错误改正后,程序才被编译为目标代码或字节只有编译错误改正后,程序才被编译为目标代码或字节码码2. 逻辑错误逻辑错误 指程序不能按预期的方案执行,机器本身无法检测,需指程序不能按预期的方案执行,机器本身无法检测,需人工对运行结果人工对运行结果 及程序逻辑进行分析,找出错误原因及程序逻辑进行分析,找出错误原因3. 运行错误运行错误 程序在运行中产生的错误,这类错误可能来自程序员没程序在运行中产生的错误,
4、这类错误可能来自程序员没有预料到的各种情况,或者超出程序员控制的各种因素有预料到的各种情况,或者超出程序员控制的各种因素9.1 9.1 异常处理知识异常处理知识 异常异常(exception)是特殊的运行错误是特殊的运行错误 其定义是:在程序执行的时候,所发生的会中断程其定义是:在程序执行的时候,所发生的会中断程序正常执行的错误。序正常执行的错误。 如除如除0、溢出、数组下标越界、不能打开指定的文、溢出、数组下标越界、不能打开指定的文件等。件等。9.1 9.1 异常处理知识异常处理知识异常类异常类 Java的异常类是处理运行错误的特殊类,每一种异的异常类是处理运行错误的特殊类,每一种异常类都对
5、应一种特定的运行错误(异常),一旦程常类都对应一种特定的运行错误(异常),一旦程序运行中出现异常,运行时系统会产生一个相应异序运行中出现异常,运行时系统会产生一个相应异常类对象。常类对象。 Java通过系统类库中的通过系统类库中的Error类和类和Exception类及其大类及其大量的子类来描述异常,它们都是量的子类来描述异常,它们都是Throwable类的子类。类的子类。9.1 9.1 异常处理知识异常处理知识异常类异常类Error类类该类所描述的异常对象是由该类所描述的异常对象是由Java虚拟机生产并抛给虚拟机生产并抛给 系统,如内存溢出,链接错误等,一般系统,如内存溢出,链接错误等,一般
6、 Java程序不程序不 对这类运行错误进行处理,直接交给运对这类运行错误进行处理,直接交给运 行时系统处行时系统处理。理。Exception类类它的各种不同的子类分别对应着不同的异常类型,它的各种不同的子类分别对应着不同的异常类型, 如,除数为如,除数为0、数组下标越界等运行时产生的错误,、数组下标越界等运行时产生的错误, 每种异常对象(描述运行错误的对象)每种异常对象(描述运行错误的对象) 都对应着都对应着 一个异常类。一个异常类。异常处理机制异常处理机制当方法执行过程中出现错误而干扰了程序流程时,会抛出一个异当方法执行过程中出现错误而干扰了程序流程时,会抛出一个异常,即构造出一个异常类的对
7、象。常,即构造出一个异常类的对象。异常类对象代表当前出现的一个具体异常,该对象封装了异常的异常类对象代表当前出现的一个具体异常,该对象封装了异常的有关信息。有关信息。异常分为系统定义异常和用户自定义异常。异常分为系统定义异常和用户自定义异常。异常抛出方式:异常抛出方式: 自动抛出(系统定义异常)自动抛出(系统定义异常) 用用throw语句抛出(用户定义异常)语句抛出(用户定义异常)方法中的异常处理:方法中的异常处理: 捕获异常,就地解决,并使程序继续执行捕获异常,就地解决,并使程序继续执行 。 将异常向外转移,即将异常抛出方法之外,由调用该方法的将异常向外转移,即将异常抛出方法之外,由调用该方
8、法的环境去处理。环境去处理。异常的产生异常的产生public class ExceptionArry public static void main (String args) int index=0; int a_array = 1,2,3,4,5; for(index=0;index=5;index+) prt(a+index+=+a_arrayindex); prt(the end); public static void prt(String s) System.out.println(s); 【例【例9-1】数组下标越界】数组下标越界 异常的产生异常的产生【例【例9-1】数组下标越界
9、】数组下标越界 异常处理机制异常处理机制Java的异常处理机制是通过面向对象的方法处理的异常处理机制是通过面向对象的方法处理异常异常一一抛出异常抛出异常当程序发生异常时,不能正常执行,称为当程序发生异常时,不能正常执行,称为“抛抛出出(throw)”一个异常;一个异常;一个异常可以由一个异常可以由jvm自动生成,也可以由程序自动生成,也可以由程序中的方法产生中的方法产生异常对象包含了错误类型与相应的错误信息异常对象包含了错误类型与相应的错误信息二二处理异常处理异常Java在异常处理机制中使用在异常处理机制中使用 try-catch-finally语句语句来捕获处理来捕获处理 一个或多个异常对象
10、,语法格式:一个或多个异常对象,语法格式:try 可能发生错误的代码;可能发生错误的代码;catch(Exception e) 错误处理代码;错误处理代码;finally 最后要执行的代码;最后要执行的代码;try-catch-finally语句语句try 可能产生异常的代码可能产生异常的代码; catch (exceptiontype1 e) 异常异常 e的处理语句的处理语句 catch (exceptiontype2 e) 异常异常 e的处理语句的处理语句 catch (exceptiontype3 e) 异常异常 e的处理语句的处理语句 finally 最终的处理最终的处理 【例【例9-
11、3】产生被零除异常产生被零除异常public class ExceptDivideByZero public static void main(String args) int i, j = 0; i = 3 / j; /除运算,产生被除运算,产生被0除异常除异常 System.out.println(End); 【例【例9-4】使用】使用try-catch-finally处理被零除异常处理被零除异常 public class CatchExceptDivideByZero public static void main(String args) try int i, j = 0; i = 3
12、 / j; /可能产生异常的语句置于可能产生异常的语句置于try子句子句 catch(ArithmeticException e) /捕获算术异常捕获算术异常 System.out.println(发生被零除异常发生被零除异常.); finally /无论是否发生异常都要执行该子句无论是否发生异常都要执行该子句 System.out.println(nEnd!); System.out.println(n程序继续执行,可正常结束!程序继续执行,可正常结束!); public class Try2 public static void main (String args) int i=0; in
13、t a = 5,6,7,8; for(i=0;i5;i+) try System.out.print(a+i+/+i+=+(ai/i); catch(ArrayIndexOutOfBoundsException e) System.out.print(捕获数组下标越界异常捕获数组下标越界异常!); catch(ArithmeticException e) System.out.print(捕获算术异常捕获算术异常!); catch(Exception e) System.out.print(捕获捕获+e.getMessage()+异常异常!); finally System.out.print
14、ln( finally i=+i); System.out.println(继续继续!); 【例【例9-5】使用】使用try-catch-finally捕获多个异常捕获多个异常 当产生异常对象时,从第一个当产生异常对象时,从第一个catch子句开始子句开始匹配,直到向下找到一个可匹配的子句,剩下匹配,直到向下找到一个可匹配的子句,剩下的的catch语句就语句就不再进行匹配不再进行匹配也就是捕获子类异常的也就是捕获子类异常的catch语句在前,捕语句在前,捕获超类异常的获超类异常的catch语句在后。语句在后。 注意:注意: finally子句为异常处理提供一个统一的出口,子句为异常处理提供一个
15、统一的出口,无论无论try语句是否产生异常,都将执行语句是否产生异常,都将执行finally子子句;句; 当当try子句中的语句产生异常时,其后面的语子句中的语句产生异常时,其后面的语句将无法执行,在编程时可以把这部分代码放句将无法执行,在编程时可以把这部分代码放在在finally子句的语句块中,以保证程序能正常子句的语句块中,以保证程序能正常执行或正常退出执行或正常退出 同时,同时,finally子句应该包含用于释放在子句应该包含用于释放在try语句语句块中所获取的资源的代码,如,块中所获取的资源的代码,如,finally子句应子句应该关闭在该关闭在try子句中打开的所有的文件子句中打开的所
16、有的文件 当然也可以缺省当然也可以缺省finally子句子句注意:注意:9.3 9.3 异常的分类异常的分类二二程序对错误与异常处理的三种方式程序对错误与异常处理的三种方式1.程序不能处理的错误程序不能处理的错误Error类为错误类,如内存溢出等,这类错误一般类为错误类,如内存溢出等,这类错误一般由系统处理;由系统处理;Error类处理的是运行使系统发生的类处理的是运行使系统发生的内部错误,是不可恢复的,唯一的办法是终止运行内部错误,是不可恢复的,唯一的办法是终止运行程序;程序; 2.程序应避免异常,而不是主动去捕获异常程序应避免异常,而不是主动去捕获异常如数组越界,在正常的程序设计中是可以避
17、免的,如数组越界,在正常的程序设计中是可以避免的,如编程时可以利用数组长度如编程时可以利用数组长度a.length来控制程序,无来控制程序,无须使用须使用try-catch-finally去处理去处理在设计程序中,应避免这类错误在设计程序中,应避免这类错误9.3 9.3 异常的分类异常的分类二二程序对错误与异常处理的三种方式程序对错误与异常处理的三种方式3.必须捕获的异常必须捕获的异常有些异常在编写程序时是没法预料的,如文件没找有些异常在编写程序时是没法预料的,如文件没找到,网络连接失败等,为了保证程序的健壮性,到,网络连接失败等,为了保证程序的健壮性,java要求必须对这些可能出现异常的代码
18、使用要求必须对这些可能出现异常的代码使用java异常处理机制进行处理异常处理机制进行处理如,例如,例9.3 文件未找到异常文件未找到异常 import java.io.*;public class Try3 public static void main (String args) FileInputStream fis = new FileInputStream(autoexec.bat); System.out.println(I can not found this file!); 例例9.3 文件未找到异常文件未找到异常修改为:修改为:import java.io.*;public c
19、lass Try3 public static void main (String args) try FileInputStream fis = new FileInputStream(autoexec.bat); catch(Exception e) System.out.println(I can not found this file!); Exception类定义的是较轻的错误,你可以编写代码来处理这类错误,并继续程序的执行。 Exception原因: 打开的文件不存在。 网络连接中断。 操作数超过允许范围。 想要加载的类文件不存在。 试图通过空的引用型变量访问对象。 数组下标越界。
20、 Error类定义的错误是致命性错误,一般会导致程序停止执行。常见的公用异常类常见的公用异常类 介绍常见的异常类,它们都是介绍常见的异常类,它们都是RuntimeException的子类的子类1. ArithmeticException-算术异常算术异常 如果除数为如果除数为0或被或被0取模产生该异常取模产生该异常2. NullPointerException 数据未初始化异常数据未初始化异常 如果程序试图访问一个空对象的变量与方法,或一个如果程序试图访问一个空对象的变量与方法,或一个空数组的元素时,产生该异常,如空数组的元素时,产生该异常,如 int a=null; a0=0; /访问长度为
21、访问长度为0的数组,产生异常的数组,产生异常 String str=null; System.out.println(str.length(); /产生异常产生异常常见的公用异常类常见的公用异常类3. ClassCastException-强制类型转换强制类型转换 无法强制类型转换的操作,在进行强制类型转换时会无法强制类型转换的操作,在进行强制类型转换时会出现此异常,如出现此异常,如Object obj=new Object();String str= (String) obj; 对象对象obj不能强制转换为不能强制转换为String ,产生该异常,产生该异常4. ArrayIndexOutO
22、fBandsException数组下标越界数组下标越界 试图访问数组中不不存在的元素时,引发该异常,如试图访问数组中不不存在的元素时,引发该异常,如 int a=new int1; a0=0; a1=1; /下标越界,产生异常下标越界,产生异常常见的公用异常类常见的公用异常类5. NegativeArraySizeException数组负下标越界数组负下标越界 如果一个数组的长度是负数,则产生异常,如如果一个数组的长度是负数,则产生异常,如int a=new int-1; /数组长度不能为负,产生异常数组长度不能为负,产生异常以下为常见的非以下为常见的非RuntimeException的子类的
23、子类系统定义的异常类2.ClassNotFoundException 未找到要加载的类3.IOException 输入、输出错误4.InterruptedException 一线程在睡眠、等待或其他原因暂停时被其他线程打断5.UnknownHostException 无法确定主机的IP地址6.SecurityException 安全性错误,如Applet欲读写文件7.MalformedURLException URL格式错误系统将常见错误预定义为若干异常类当出现异常时自动抛出1.FileNotFoundException-文件或目录未找到到异常文件或目录未找到到异常 如果程序中使用FileIn
24、putStream类,在访问的文件不存在时会产生此异常Exception类 构造函数 Exception() Exception(String 异常描述) 方法 String getMessage() 返回异常描述。 String toString() 返回异常对象详细信息。 void printStackTrace() 打印异常发生的路径,即引起异常的方法调用嵌套序列。9.4 9.4 抛出异常类抛出异常类在异常处理机制中,在异常处理机制中, try语句必须有代码产生一个异常对语句必须有代码产生一个异常对象并把它抛出象并把它抛出, catch语句捕获一个异常对象。语句捕获一个异常对象。而抛出异
25、常对象,即可以是而抛出异常对象,即可以是java运行时系统异常运行时系统异常;也可以是程序员自己编写的代码也可以是程序员自己编写的代码;1.使用使用throw语句抛出异常语句抛出异常throw抛出异常的格式如下:抛出异常的格式如下:throw ;其中,其中,throw是关键字,异常对象是创建的异常类对象是关键字,异常对象是创建的异常类对象通过例子来说明通过例子来说明throw的使用的使用9.4 9.4 抛出异常类抛出异常类 if (i0)throw new Exception(over boounds); System.out.println(产生异常!产生异常!); 9.4 9.4 抛出异常
26、抛出异常2.抛出异常的方法与调用异常的方法处理异常抛出异常的方法与调用异常的方法处理异常在前面的例子中都是,异常的处理都是在抛出异常的在前面的例子中都是,异常的处理都是在抛出异常的方法在来处理,也就是异常的抛出与处理在同一个方方法在来处理,也就是异常的抛出与处理在同一个方法中;法中;在实际的编程中,一个方法并不需要处理它所产生的在实际的编程中,一个方法并不需要处理它所产生的异常,而是向上传递,由调用它的方法处理异常;异常,而是向上传递,由调用它的方法处理异常;那么与异常有关的就有两个方法:那么与异常有关的就有两个方法:抛出异常的方法;抛出异常的方法;处理异常的方法处理异常的方法9.4 9.4
27、抛出异常抛出异常 抛出异常的方法抛出异常的方法如果在一个方法中产生异常并不处理,那么就需要使用throws语句,用来抛出所产生的异常;带有throws语句的方法声明如下:返回类型返回类型 方法名方法名(参数列表参数列表) throws 异常类列表异常类列表; 其中,其中, throws是关键字,是关键字,异常类列表中异常类列表中可以有多个异可以有多个异常类,用逗号隔开;常类,用逗号隔开;抛出异常的方法并不处理异常,抛出异常的方法并不处理异常,注意注意: throw与与throws 在语义与用法的区别在语义与用法的区别9.4 9.4 抛出异常类抛出异常类public class Tspublic
28、 void go(int i) throws Exceptionif (i0)throw new Exception(over boounds);System.out.println(产生异常!产生异常!);public static void main(String args) Ts x=newTs(); tryx.go(10); catch(Exception e) System.out.println(e.toString(); 9.5 9.5 自定义异常类自定义异常类由于程序的复杂性,由于程序的复杂性,Java系统虽然已经定义了很多异常类,系统虽然已经定义了很多异常类,但有些情况下程序
29、员必须自己定义那些未被系统定义的异常;但有些情况下程序员必须自己定义那些未被系统定义的异常;程序员可通过程序员可通过Exception类创建自己的异常类类创建自己的异常类程序代码如下程序代码如下:自定义异常类自定义异常类class OverflowException extends Exception public void printMsg() System.out.println(exception: +this.getMessage(); this.printStackTrace(); System.exit(0); /终止当前正在运行的终止当前正在运行的 Java 虚拟机。参数用作状态码;虚拟机。参数用作状态码;根据惯例,非零的状态码表示异常终止根据惯例,非零的状态码表示异常终止 自定义异常类,继承于自定义异常类,继承于异常类异常类Exception用于输出异常信息的用于输出异常信息的成员方法成员方法只有当try块中执行System.exit()时,会立即结束程序。用处:用于非内存的系统资源的释放,如打开的文件、建立的网络连接等public class Try7 public void calc(byte k) throws OverflowException byte y=1, i=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年药理学考试的细节试题及答案
- 小学科学与语文交叉试题及答案
- 2024年汽车维修技术规范试题及答案
- 大咯血考试题目及答案
- 宠物营养教育的内容与策略试题及答案
- 智慧解决方案的可靠性评估
- 小学跆拳道课件
- 2024年汽车维修工考试的趋势分析试题及答案
- 2024年汽车美容师成就与挑战考量试题及答案
- 2024年美容师企业文化理解试题及答案
- 旅游概论(刘伟主编)(全国高职高专旅游类“十二五”示范教材) 全套课件(中)
- 2023年中国疾病预防控制中心招聘应届高校毕业生考试真题及答案
- 建设工程检测报告编制导则DB64-T1685-2020
- 项目干系人与干系人管理
- Java基础实践教程-Java编程基础
- 高等职业学校建设标准(2022年版)
- 无人机的生产流程
- 油漆修缮施工方案
- 山东省济南市2022-2023学年高一下学期期中考试语文试题(解析版)
- 奖学金评定模型
- 室外管网工程-工程施工进度计划表
评论
0/150
提交评论