第5章 异常处理_第1页
第5章 异常处理_第2页
第5章 异常处理_第3页
第5章 异常处理_第4页
第5章 异常处理_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、第第5章章 异常处理异常处理实际运行的软件系统实际运行的软件系统不仅不仅具有满足用户需求的强具有满足用户需求的强大功能,大功能,还必须还必须具有高度的具有高度的可靠性、稳定性可靠性、稳定性和和容错性容错性。Java语言语言语法体系语法体系是严密的,是严密的,语法检查语法检查是严格的,是严格的,不仅不仅在在编译时编译时能够检查出所有语法错误,能够检查出所有语法错误,而且而且在在运行时运行时能够捕获到所有运行时错误;能够捕获到所有运行时错误;Java的的异常处理异常处理提供对运行时错误的语言级处理机制;提供对运行时错误的语言级处理机制;Java的的内存自动管理内存自动管理提供内存资源使用的安全性。

2、提供内存资源使用的安全性。第第5章章 异常处理异常处理异常处理异常处理捕获和处理运行时错误的一种机制。捕获和处理运行时错误的一种机制。u异常处理异常处理机制机制使程序具有处理错误的能力,即使使程序具有处理错误的能力,即使发生了运行时错误,应用程序能够捕获异常并及发生了运行时错误,应用程序能够捕获异常并及时处理异常,使程序从运行时错误中很好地恢复时处理异常,使程序从运行时错误中很好地恢复并继续运行,而不会导致程序运行非正常终止。并继续运行,而不会导致程序运行非正常终止。第第5章章 异常处理异常处理5.1 程序错误与处理程序错误与处理5.2 Java的异常处理的异常处理5.1 程序错误与处理程序错

3、误与处理 程序错误、发现时刻及错误处理原则程序错误、发现时刻及错误处理原则 面向过程语言与面向对象语言面向过程语言与面向对象语言 的错误处理方式比较的错误处理方式比较的错误和异常的错误和异常1. 语法错语法错( (编译错编译错) )程序错误、发现时刻及错误处理原则程序错误、发现时刻及错误处理原则语法错语法错违反语法规范违反语法规范的错误,通常在的错误,通常在编译时编译时发现。发现。例如:例如:标识符未声明、表达式中运算符与操作数类型不兼容、标识符未声明、表达式中运算符与操作数类型不兼容、 变量赋值时的类型与声明时的类型不匹配、变量赋值时的类型与声明时的类型不匹配、 括号不匹配、语句末尾缺少分号

4、等。括号不匹配、语句末尾缺少分号等。发现和排除:发现和排除: Java编译器编译器能够发现能够发现所有语法错所有语法错,给出错误的位置和性质。,给出错误的位置和性质。syntax error2. 语义错语义错( (运行错运行错) )程序错误、发现时刻及错误处理原则程序错误、发现时刻及错误处理原则语义错语义错如果程序在如果程序在语法上正确语法上正确,但在,但在语义上存在错误语义上存在错误。 不能被不能被编译系统发现,编译系统发现,只有只有到程序到程序运行时才能被系统运行时才能被系统 发现发现,所以含有语义错的程序,所以含有语义错的程序能够通过编译能够通过编译。semantic error (ru

5、n-time error)例如:例如:输入数据格式错、除数为输入数据格式错、除数为0 0错、错、 给变量赋予超出其范围的值等。给变量赋予超出其范围的值等。发现和排除:发现和排除: Java解释器解释器在运行时能够发现语义错,一旦发现了语义错,在运行时能够发现语义错,一旦发现了语义错,Java将停止程序运行,并给出错误的位置和性质。将停止程序运行,并给出错误的位置和性质。3. 逻辑错逻辑错程序错误、发现时刻及错误处理原则程序错误、发现时刻及错误处理原则logic error 语义错语义错如果程序通过编译,可运行,但运行结果与期望值如果程序通过编译,可运行,但运行结果与期望值 不符,这类错误称为逻

6、辑错。不符,这类错误称为逻辑错。例如:例如:由于循环条件不正确而没有结果,由于循环条件不正确而没有结果, 循环次数不对等因素导致计算结果不正确等。循环次数不对等因素导致计算结果不正确等。发现和排除:发现和排除: 由于由于系统无法找到逻辑错系统无法找到逻辑错,所以逻辑错最难确定和排除。,所以逻辑错最难确定和排除。程序员必须凭借自身的程序设计经验,找到错误原因及出错位程序员必须凭借自身的程序设计经验,找到错误原因及出错位置,从而改正错误。置,从而改正错误。 面向过程语言与面向对象语言的错误处理方式比较面向过程语言与面向对象语言的错误处理方式比较1. 面向过程语言错误处理方式的缺陷面向过程语言错误处

7、理方式的缺陷 面向过程语言面向过程语言提供的错误处理方式是不完全的,不能保证提供的错误处理方式是不完全的,不能保证 及时发现错误并制止错误的蔓延。及时发现错误并制止错误的蔓延。例如:例如:C C语言在默认情况下是不进行数据范围检查的,语言在默认情况下是不进行数据范围检查的,面向过程语言面向过程语言没有提供对运行时错误的防范和处理机制,只没有提供对运行时错误的防范和处理机制,只 能任凭错误的产生而导致程序运行中断。能任凭错误的产生而导致程序运行中断。例如:例如:输入数据格式错、文件不存在、无法连接数据库、输入数据格式错、文件不存在、无法连接数据库、 网络连接中断等。网络连接中断等。面向过程语言提

8、供的错误处理方式面向过程语言提供的错误处理方式显然不能满足显然不能满足面向对象程序设计的要求。面向对象程序设计的要求。2. 面向对象语言异常处理的思想面向对象语言异常处理的思想 面向过程语言与面向对象语言的错误处理方式比较面向过程语言与面向对象语言的错误处理方式比较面向对象程序设计思想面向对象程序设计思想程序的程序的正确性、可靠性正确性、可靠性和和稳定性稳定性比比 程序效率更重要。程序效率更重要。面向对象语言面向对象语言提供语言级的错误防范和处理机制,即异常提供语言级的错误防范和处理机制,即异常 处理机制,它提供全面的、强有力的错误检查与处理方法。处理机制,它提供全面的、强有力的错误检查与处理

9、方法。异常处理机制异常处理机制将将运行时错误运行时错误封装成若干封装成若干错误类错误类和和异常类异常类, 并并提供异常处理语句提供异常处理语句用于用于在程序中实现在程序中实现对运对运 行时错误的发现和及时处理行时错误的发现和及时处理,是一种对异常,是一种对异常 进行事后处理的机制。进行事后处理的机制。 2. 面向对象语言异常处理的思想面向对象语言异常处理的思想 异常处理机制的异常处理机制的优越性体现优越性体现在以下两方面:在以下两方面: n 从语法上看从语法上看,异常处理语句将,异常处理语句将程序正常代码程序正常代码与与错误处理代码错误处理代码 分开分开,使程序结构清晰,算法重点突出,可读性强

10、。,使程序结构清晰,算法重点突出,可读性强。n 从运行效果看从运行效果看,异常处理语句,异常处理语句使程序具有处理错误的能力使程序具有处理错误的能力。即使发生了运行错,应用程序能够捕获异常并及时处理异常,即使发生了运行错,应用程序能够捕获异常并及时处理异常,使程序从运行错误中很好地恢复并继续运行,而不会导致程序使程序从运行错误中很好地恢复并继续运行,而不会导致程序运行非正常终止。而且,如果当前方法没有能力处理异常,还运行非正常终止。而且,如果当前方法没有能力处理异常,还可以将异常转交给调用者处理。可以将异常转交给调用者处理。 Java的错误和异常的错误和异常1. Java语言是安全的语言是安全

11、的 n Java语言提供语言提供严密的语法规则严密的语法规则,弥补了,弥补了C+语言的不严密之处。语言的不严密之处。n Java在在编译和运行时严格检查错误编译和运行时严格检查错误,能够发现所有语法错和,能够发现所有语法错和 运行错,能够发现运行错,能够发现C+不能发现的错误。不能发现的错误。例如:例如:整数和字符等不同类型的数据不能进行运算等;整数和字符等不同类型的数据不能进行运算等;Java放弃了放弃了C+C+中中全程变量全程变量、goto语句语句、宏定义宏定义、全局函数以全局函数以及结构及结构、联合和指针数据类型联合和指针数据类型,减少了潜在的程序错误。,减少了潜在的程序错误。 例如:例

12、如:不能使用指针对指定地址的内存区域进行操作等。不能使用指针对指定地址的内存区域进行操作等。例如:例如:数组下标越界错误等。数组下标越界错误等。 Java的错误和异常的错误和异常1. Java语言是安全的语言是安全的 n Java提供异常处理机制提供异常处理机制,使程序,使程序能够捕获并处理运行错能够捕获并处理运行错, 从而保证从而保证Java程序运行的程序运行的可靠性和容错性可靠性和容错性。n Java提供内存自动管理方式提供内存自动管理方式,能够自动跟踪程序使用的所有,能够自动跟踪程序使用的所有 内存资源,并且当内存资源不再被使用时能够自动回收,内存资源,并且当内存资源不再被使用时能够自动

13、回收,不不 需要在程序中写释放内存语句需要在程序中写释放内存语句,既减少了既减少了程序员的工作量,程序员的工作量, 又提高了又提高了可靠性和安全性。可靠性和安全性。 Java的错误和异常的错误和异常2. 错误与异常错误与异常 (1) 错误错误(error) 错误错误指程序运行时遇到的指程序运行时遇到的硬件硬件或或操作系统的错误操作系统的错误。 n 错误错误对于程序而言是对于程序而言是致命的致命的,将导致程序无法运行将导致程序无法运行,而且,而且 程序本身不能处理错误,只能依靠外界干预,否则会一直程序本身不能处理错误,只能依靠外界干预,否则会一直 处于非正常状态。处于非正常状态。例如:例如:没有

14、找到没有找到.class文件;文件; .class文件中没有文件中没有main()方法等。方法等。 Java的错误和异常的错误和异常2. 错误与异常错误与异常 (2) 异常异常(exception) 异常异常指在硬件和操作系统正常时,程序遇到的指在硬件和操作系统正常时,程序遇到的运行错运行错。 n 异常异常对于程序而言是对于程序而言是非致命的非致命的,虽然异常,虽然异常会导致程序非正会导致程序非正 常终止常终止,但,但Java的的异常处理机制异常处理机制使程序自身能够捕获和处使程序自身能够捕获和处 理异常,由异常处理代码调整程序运行方向,理异常,由异常处理代码调整程序运行方向,使程序仍可使程序

15、仍可 继续运行继续运行。例如:例如:整数进行除法运算时除数为整数进行除法运算时除数为0; 操作数超出数据范围;操作数超出数据范围; 打开一个文件时发现文件不存在;打开一个文件时发现文件不存在; 网络连接中断等。网络连接中断等。编译程序非正常终止运行有语法错?有 Java程序修改运行出现运行时错误?错误程序运行正常结束有没有没有异常程序非正常终止运行事先处理避免异常事后处理异常处理修改图5.1 Java程序发现错误和异常 Java的错误和异常的错误和异常3. 错误类和异常类错误类和异常类(1) Error类类(错误类错误类) n Error类对象类对象由由Java虚拟机生成虚拟机生成并并抛出给系

16、统抛出给系统,有内存溢出,有内存溢出错误、栈溢出错误、动态链接错误等。错误、栈溢出错误、动态链接错误等。 例如:例如:当运行没有当运行没有main()方法的类时,则产生类定义未找到错误方法的类时,则产生类定义未找到错误 (noClassDefFoundError); 当使用当使用new分配内存时,如果没有可用内存,则产生内存分配内存时,如果没有可用内存,则产生内存 溢出错误溢出错误 (OutOfMemoryError); Java的错误和异常的错误和异常(2) Exception类类(异常类异常类) 3. 错误类和异常类错误类和异常类n Exception类对象是类对象是Java程序捕获和处理

17、的对象程序捕获和处理的对象。每一种异。每一种异 常对应于常对应于Exception类的一个子类,异常对象中类的一个子类,异常对象中包含错误的位包含错误的位 置和特征信息置和特征信息。Java预定义了多种通用的异常类:预定义了多种通用的异常类:例如例如除数为除数为0的算术异常、数组下标越界异常、空指针异常等。的算术异常、数组下标越界异常、空指针异常等。Java中也可以自定义异常类。中也可以自定义异常类。注:注:Exception类和类和Error类都是类都是Throwable类的子类。类的子类。 Java的错误和异常的错误和异常【例例5.1】发现除数为发现除数为0 0错。错。运行时运行时能够发现

18、能够发现整数除法中除数为整数除法中除数为0 0的语义错。的语义错。运行时运行时不能发现不能发现浮点数除法中除数为浮点数除法中除数为0 0的语义错。的语义错。 对于整数除法中除数为对于整数除法中除数为0 0的语义错,的语义错,Java在运行时能够在运行时能够发现并抛出异常,程序停止运行;发现并抛出异常,程序停止运行; 对于浮点除法中除数为对于浮点除法中除数为0 0的语义错,的语义错,Java在运行时不能在运行时不能发现,运算结果为发现,运算结果为Infinity(无穷大)。无穷大)。 /整数除法,除数为整数除法,除数为0 0,抛出算术异常,抛出算术异常 /浮点数除法,除数为浮点数除法,除数为0

19、0,没有抛出异常,运行结果为,没有抛出异常,运行结果为Infinity(无穷大)(无穷大) Java的错误和异常的错误和异常【例例5.2】发现数组下标越界的语义错。发现数组下标越界的语义错。public class Outofbounds public static void main (String args) int a = 1,2,3,4; for (int i=0;i多个多个catch子句需要子句需要按异常类按异常类从子类到父类的次序从子类到父类的次序依次排列依次排列。异常处理语句异常处理语句 2. 异常处理语句执行过程异常处理语句执行过程(3) 执行执行finally子句子句 fin

20、ally子句中的语句系列是子句中的语句系列是最后必须执行的代码,无论最后必须执行的代码,无论是否产生异常是否产生异常。 当当try子句中的某条语句产生一个异常时,该语句之后的子句中的某条语句产生一个异常时,该语句之后的语句序列都将不会被执行。如果有些语句肯定需要被执行,语句序列都将不会被执行。如果有些语句肯定需要被执行,不管是否产生了异常,则这些语句需要写在不管是否产生了异常,则这些语句需要写在finally子句中。子句中。 注:注:try-catch- finally 语句的结构语句的结构使使正常执行的语句正常执行的语句与与异常处异常处理的语句理的语句分离分离,增强了程序的可读性增强了程序的

21、可读性。 出现运行时错误,Java抛出异常,中断执行语句序列没有运行时错误,没有产生异常 try 语句1 catch (捕获异常对象) 异常处理 finally 语句3 是异常处理后 程序停止运行 catch捕获异常对象?否图图5.4 异常处理语句的执行流程异常处理语句的执行流程 异常处理语句异常处理语句 【例例5.4】求数组元素的平均值。求数组元素的平均值。public class ArrayAverage1 public static double average(int table) /求数组元素的平均值求数组元素的平均值 double sum=0.0; for (int i=0;ita

22、ble.length;i+) /避免数组下标越界异常避免数组下标越界异常 sum += tablei; return sum / table.length; table=null时,访问时,访问table.length产生空对象异常;产生空对象异常;table=!null& table.length=0时,除数为时,除数为0 0无法计算平均值。无法计算平均值。int y=; /y!=null, y.length=0y=new int0; /y!=null, y.length=0 average()方法中采用方法中采用if 语句语句对可能出现的运行时错对可能出现的运行时错 误进行误进行事

23、先处理事先处理 tointArray()方法采用方法采用异常处理异常处理语句对产生的运行时语句对产生的运行时 错误进行错误进行事后处理事后处理 采用采用命令行参数命令行参数作为作为输入值输入值【例例5.4】求数组元素的平均值。求数组元素的平均值。异常处理语句异常处理语句 1. 抛出自定义异常对象的抛出自定义异常对象的throw语句语句 抛出异常抛出异常 Java提供给程序提供给程序主动抛出异常的语句是主动抛出异常的语句是throw: throw 异常对象异常对象 /是程序创建的制定异常类对象是程序创建的制定异常类对象由由throw语句抛出的异常也必须语句抛出的异常也必须由由try语句捕获并处理

24、语句捕获并处理。抛出异常抛出异常 public void set(int age) throws Exception if (age0 & age0 & age0 & age100) this.age = age; else throw new Exception (“IllegalAgeData:”); /抛出异常抛出异常 catch (Exception e e) /虽然捕获到了异常但不能处理,虽然捕获到了异常但不能处理,this.age仍没有值仍没有值 抛出异常抛出异常 2. 方法声明抛出异常的方法声明抛出异常的throws子句子句 如果一个方法的方法体将产生异常

25、,而该方法体中如果一个方法的方法体将产生异常,而该方法体中不想不想处理处理或或不能处理该异常不能处理该异常,则可以在方法声明时,采用,则可以在方法声明时,采用throws子句子句声明该方法将抛出异常。声明该方法将抛出异常。 修饰符修饰符 返回值类型返回值类型 方法方法(参数列表参数列表) throws 异常类异常类 /是方法要抛出的异常类,可以声明多个是方法要抛出的异常类,可以声明多个 例如:例如:public static int parseInt (String s) throws NumberFormatException抛出异常抛出异常 调用声明抛出异常的方法,调用声明抛出异常的方法,

26、必须使用必须使用try语句捕获并处理语句捕获并处理指定异常类指定异常类,否则编译不通过。,否则编译不通过。2. 方法声明抛出异常的方法声明抛出异常的throws子句子句 try temp count = Integer. parseInt (stri); count+; catch ( NumberFormatException e) 字符串字符串”+stri+“不能转换为整数,产生的异常类是不能转换为整数,产生的异常类是” +e. getClass(). getName(); throws子句的作用子句的作用是:是:声明方法抛出指定异常,声明方法抛出指定异常,则方法的调用者必须捕获则方法的调用者必须捕获并处理该指定异常,这样并处理该指定异常,这样实现了异常对象在方法之实现了异常对象在方法之间的传递。间的传递。抛出异常抛出异常 【例例5.6】声明抛出异常的方法与方法调用者处理异常。声明抛出异常的方法与方法调用者处理异常。 程序中,构造方法和重载的程序中,构造方法和重载的set()方法因为调用了方法因为调用了set()方法方法 而本身又无法处理而

温馨提示

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

评论

0/150

提交评论