《教学课件第八章 异常处理.ppt》由会员分享,可在线阅读,更多相关《教学课件第八章 异常处理.ppt(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、PPT模板下载:/moban/ 行业PPT模板:/hangye/ 节日PPT模板:/jieri/ PPT素材下载:/sucai/PPT背景图片:/beijing/ PPT图表下载:/tubiao/ 优秀PPT下载:/xiazai/ PPT教程: /powerpoint/ Word教程: /word/ Excel教程:/excel/ 资料下载:/ziliao/ PPT课件下载:/kejian/ 范文下载:/fanwen/ 试卷下载:/shiti/ 教案下载:/jiaoan/ 字体下载:/ziti/ 教学课件第八章 异常处理LOGOCompany Logo在本章中,我们将会学到:38.3了解如何自
2、定义异常了解如何自定义异常 38.1异常的概念和类层次异常的概念和类层次 38.2异常处理的格式异常处理的格式 Company Logo8.1 异常(异常(Exception) 8.1.1 什么是异常什么是异常v程序错误包含两类:编译时错误和运行时错误。编程序错误包含两类:编译时错误和运行时错误。编译错误是指编译器在编译源文件时发现的代码问题;译错误是指编译器在编译源文件时发现的代码问题;运行时错误是指程序代码无误,但运行过程中发生运行时错误是指程序代码无误,但运行过程中发生的不正常情况。这种在程序运行过程中发生的异常的不正常情况。这种在程序运行过程中发生的异常事件,简称异常(事件,简称异常(
3、Exception)。比如数组下标越)。比如数组下标越界,除数为界,除数为0,文件无法找到等。为保证程序的健,文件无法找到等。为保证程序的健壮性,针对异常的处理工作就称为异常处理。壮性,针对异常的处理工作就称为异常处理。vJava作为网络应用语言,保证服务器端应用程序的作为网络应用语言,保证服务器端应用程序的稳定性和健壮性是至关重要的,为了阻止这些异常稳定性和健壮性是至关重要的,为了阻止这些异常的发生,的发生,Java在程序的健壮性方面做了很多工作,在程序的健壮性方面做了很多工作,例如制作了完整的异常处理类机制。例如制作了完整的异常处理类机制。 Company Logo8.1.2 异常类层次异
4、常类层次 Java的异常处理类层次如图所示:的异常处理类层次如图所示: v类类Throwable是所有错误类(是所有错误类(Error)和异常类()和异常类(Exception)的父类。的父类。vError类及其子类由类及其子类由Java虚拟机生成并抛出,由系统接收并处虚拟机生成并抛出,由系统接收并处理,程序员无法通过调整程序代码来避免这种错误,如理,程序员无法通过调整程序代码来避免这种错误,如VirtualMachineError,AWTError等。等。vException类是所有异常类的父类,其子类可分为两种:运行类是所有异常类的父类,其子类可分为两种:运行时异常(时异常(Runtime
5、Exception)和其它类型的异常。)和其它类型的异常。v其中运行时异常(其中运行时异常(RuntimeException)是程序运行过程中出)是程序运行过程中出现的问题,如:数组下标越界异常现的问题,如:数组下标越界异常IndexOutOfBoundsException,数学异常,数学异常ArithmeticException等。等。v除运行时异常之外的异常都称为其它类型异常。除运行时异常之外的异常都称为其它类型异常。 Company LogoJava的异常处理类层次如图所示:的异常处理类层次如图所示:ObjectThrowableErrorException其它类型异常其它类型异常Run
6、timeExceptionIOExceptionArithmeticExceptionVirtualMachineError图图8-1 异常处理异常处理类层次类层次Company Logo部分异常简介如下:部分异常简介如下: 异常子类异常子类说明说明ArithmeticExceptioArithmeticException n算术错误,如除以算术错误,如除以 0 0IllegalArgumentExcIllegalArgumentExceptioneption方法收到非法参数方法收到非法参数ArrayIndexOutOfBouArrayIndexOutOfBoundsExceptionndsE
7、xception数组下标出界数组下标出界NullPointerExceptiNullPointerExceptionon试图访问试图访问 null null 对象引用对象引用SecurityExceptionSecurityException试图违反安全性试图违反安全性ClassNotFoundExcepClassNotFoundExceptiontion不能加载请求的类不能加载请求的类ClassCastExceptionClassCastException试图将对象强制转换为不是该实试图将对象强制转换为不是该实例的子类时例的子类时NegativeArraySizeENegativeArray
8、SizeExceptionxception应用程序试图创建大小为负的数应用程序试图创建大小为负的数组组表表8-1 RuntimeException类的子类类的子类异常子类异常子类说明说明AWTExceptionAWTExceptionAWT AWT 中的异常中的异常IOExceptionIOExceptionI/O I/O 异常的根类异常的根类FileNotFoundExcepFileNotFoundExceptiontion不能找到文件不能找到文件EOFExceptionEOFException文件结束文件结束IllegalAccessExceIllegalAccessExceptionpt
9、ion对类的访问被拒绝对类的访问被拒绝NoSuchMethodExcepNoSuchMethodExceptiontion请求的方法不存在请求的方法不存在InterruptedExceptInterruptedExceptionion线程中断线程中断SQLExceptionSQLException数据库访问错误数据库访问错误表表8-2 其它异常类的子类其它异常类的子类Company Logo 8.1.3 异常处理的使用时机异常处理的使用时机 在在Java中规定,其它类型异常必须捕获处理;中规定,其它类型异常必须捕获处理;RuntimeException可以不做处理,可以不做处理,也建议不做处理
10、。看下例:也建议不做处理。看下例: 例例8-1:从键盘上读入两个数,求他们的和:从键盘上读入两个数,求他们的和 异常的使用时机:异常的使用时机:1)如果是可以预料到的,通过简单的表达式修改或代码校验就可以处理好的,就不如果是可以预料到的,通过简单的表达式修改或代码校验就可以处理好的,就不必使用异常(如运行时异常中的数组越界或除数为必使用异常(如运行时异常中的数组越界或除数为0),这是因为),这是因为Java的异的异常都是异常类的对象,系统处理对象所占用的处理时间远比基本的运算要多常都是异常类的对象,系统处理对象所占用的处理时间远比基本的运算要多得多(效率可能相差几百倍,乃至千倍),这也是为什么
11、对得多(效率可能相差几百倍,乃至千倍),这也是为什么对RuntimeException建议不做处理的原因;建议不做处理的原因;2)因为异常占用了因为异常占用了JAVA程序的许多处理时间,简单的测试比处理异常的效率更高。程序的许多处理时间,简单的测试比处理异常的效率更高。所以,建议将异常用于你无法预料或无法控制的情况(如打开远程文件,可所以,建议将异常用于你无法预料或无法控制的情况(如打开远程文件,可能会产生能会产生FileNotFoundException,而从外设读入数据,可能会产生,而从外设读入数据,可能会产生IOException););3)而而Error类对象就不必处理,类对象就不必处
12、理,Error的实例是的实例是JAVA运行时环境(运行时环境(JVM)中的内部错)中的内部错误,通常是致命的,对它们你无法做太多的工作;误,通常是致命的,对它们你无法做太多的工作;4)花费时间处理异常可能会影响你的代码的编写和执行速度,但在稍后的项目和在花费时间处理异常可能会影响你的代码的编写和执行速度,但在稍后的项目和在越来越大的程序中再次使用你的类时,这种额外的小心将会给你带来极大的越来越大的程序中再次使用你的类时,这种额外的小心将会给你带来极大的回报(当然回报(当然JAVA类库是小心编写的,它已经足够强壮)。类库是小心编写的,它已经足够强壮)。Company Logo例例8-1:从键盘上
13、读入两个数,求他们的和:从键盘上读入两个数,求他们的和import java.io.*;public class IOExceptionDemo public static void main(String args) int n1,n2; /使用输入流,从键盘接收数据使用输入流,从键盘接收数据 BufferedReader br=newBufferedReader(new InputStreamReader(System.in); System.out.println(Please input first Integer Number:); try n1=Integer.parseInt(b
14、r.readLine(); /从键盘接收第一个字符串从键盘接收第一个字符串 System.out.println(Please input second Integer Number:); n2=Integer.parseInt(br.readLine(); /从键盘接收第二个字符串从键盘接收第二个字符串 System.out.println(The sum is:+(n1+n2); catch(IOException e) System.out.println(The Input is error!); 【运行结果运行结果】Please input first Integer Number:
15、 3Please input second Integer Number: 45The sum is: Company Logo8.2 异常处理异常处理 8.2.1 捕获异常捕获异常捕获异常的基本格式为:捕获异常的基本格式为:try 产生异常的代码产生异常的代码 catch (Exception类或子类类或子类 异常类实例异常类实例) 处理异常处理异常 catch (Exception类或子类类或子类 异常类实例异常类实例) 处理异常处理异常 finally 代码代码 格式说明:格式说明:1try语句将可能产生异常的代码放在语句将可能产生异常的代码放在try 块中,这些代码可能会产生一个或多个
16、异常。块中,这些代码可能会产生一个或多个异常。2catch语句:语句:catch的参数为一个的参数为一个Exception类或其子类的实例,当类或其子类的实例,当try块中的代码出现异常时,将根据产生的块中的代码出现异常时,将根据产生的异常类型,从出错的代码行处立即转到相配备的异常类型,从出错的代码行处立即转到相配备的catch块中执行,而异常信息也存储到相应块中执行,而异常信息也存储到相应catch块的块的参数实例中。参数实例中。catch块可以有多个,分别用于捕获处理不同的异常类型,块可以有多个,分别用于捕获处理不同的异常类型,Java运行时系统将从前至后依运行时系统将从前至后依次寻找相匹
17、配的次寻找相匹配的catch块,为了避免遗漏异常,建议将异常类基类块,为了避免遗漏异常,建议将异常类基类Exception以放在以放在catch块参数中,用块参数中,用于捕获前面所有异常处理都不匹配的情况,如:于捕获前面所有异常处理都不匹配的情况,如: try产生异常的代码,可能产生多种异常产生异常的代码,可能产生多种异常 catch (FileNotFoundException e) 处理异常处理异常 catch (SQLException e) 处理异常处理异常 catch (Exception e) 处理异常处理异常 /所有遗漏的异常将在这里捕获所有遗漏的异常将在这里捕获 但是需要注意,
18、但是需要注意,catch (Exception e)只能放在所有只能放在所有catch块的最后一句,因为块的最后一句,因为Exception类是所有异常类是所有异常类的父类,它放在前面将会屏蔽所有后面的子类,事实上,如果类的父类,它放在前面将会屏蔽所有后面的子类,事实上,如果catch (Exception e)语句放在前面,语句放在前面,编译时会产生编译时会产生“Exception has already been caught”(异常已被捕获异常已被捕获)错误。错误。3fianlly语句:语句:finally块是可选项,不管块是可选项,不管try块中是否产生异常,都要执行块中是否产生异常,
19、都要执行finally块的代码,执行过程如图块的代码,执行过程如图8-2。例例8-2:trycatchfinally块执行流程块执行流程Company Logo图8-2 异常处理执行流程 tryfinallycatchfinally没有异常没有异常产生异常产生异常Company Logo例例8-2:trycatchfinally块执行流程块执行流程class FinallyDemo int no1,no2; FinallyDemo(String args) try no1 = Integer.parseInt(args0); no2 = Integer.parseInt(args1); Sys
20、tem.out.println(相除结果为相除结果为 +no1/no2); catch(ArithmeticException e) System.out.println(除数不能为除数不能为 0); finally System.out.println(Finally 已执行,程序结束!已执行,程序结束!); public static void main(String args) new FinallyDemo(args); 【运行过程及结果运行过程及结果】DOS提示符提示符java FinallyDemo 10 2相除结果为相除结果为 5Finally 已执行,程序结束!已执行,程序结束
21、!DOS提示符提示符java FinallyDemo 10 0除数不能为除数不能为 0Finally 已执行,程序结束!已执行,程序结束! Company Logo 8.2.2 声明异常(声明异常(throws) 1、异常调用链、异常调用链 2、声明异常、声明异常 “声明异常声明异常”是指当异常在异常调用链中传递的时候,为了让上层的是指当异常在异常调用链中传递的时候,为了让上层的调用方法知道被调用方法可能抛出的异常种类,在被调用方法调用方法知道被调用方法可能抛出的异常种类,在被调用方法的声明后使用的声明后使用throws关键字指明要产生的异常种类的操作。关键字指明要产生的异常种类的操作。thr
22、ows关键字只是个声明式的语法,但对于产生自定义异常关键字只是个声明式的语法,但对于产生自定义异常的方法,它却是必要的(见的方法,它却是必要的(见8.3节)。节)。 例例8-3:在在divide( )方法内部进行异常处理方法内部进行异常处理 例例8-4:在主方法在主方法main( )中进行异常处理中进行异常处理 main( )产生异常的方法产生异常的方法调用异常的方法调用异常的方法程程序序退退出出点点Company Logo例例8-3:在:在divide( )方法内部进行异常处理方法内部进行异常处理public class ExceptionChain static void divide(i
23、nt x,int y) /在此方法内进行了异常处理在此方法内进行了异常处理tryint z=x/y;System.out.println(the result is :+z);catch(ArithmeticException e) System.out.println(e.getMessage(); public static void main(String args) divide(4,0); Company Logo例例8-4:在主方法:在主方法main( )中进行异常处理中进行异常处理public class ExceptionChain static int divide(int
24、x,int y)throws ArithmeticException /抛出异常抛出异常return x/y; public static void main(String args) /在主方法内进行了异常在主方法内进行了异常处理处理 try System.out.println(divide(4,0); catch(ArithmeticExceptione) System.out.println(e.getMessage(); Company Logo8.2.3 抛出异常(抛出异常(throw) 使用的语法为:使用的语法为:throw 异常类对象;异常类对象; 例例8-5: throw的用
25、法。的用法。 public class ExceptionChain static int divide(int x,int y) throws ArithmeticException if(y=0)throw new ArithmeticException(除数不能为除数不能为0!);elsereturn x/y; public static void main(String args) trySystem.out.println(divide(4,0); catch(ArithmeticException e)System.out.println(“产生异产生异常:常:+e.getMess
26、age(); 【运行结果运行结果】产生异常:除数不能为产生异常:除数不能为0! Company Logo8.2.4 异常类中常用方法 vJava中的异常类都是中的异常类都是Exception类的子类,类的子类,Exception类的构类的构造方法有两种:造方法有两种:vException( );vException(String message);v第一种构造方法能创建无返回参数的异常类对象,第二种构造第一种构造方法能创建无返回参数的异常类对象,第二种构造方法能创建带参数的异常类对象。所谓的参数是指方法能创建带参数的异常类对象。所谓的参数是指getMessage( )方法得到的字符串类型的信息
27、。例如:方法得到的字符串类型的信息。例如:vException e = new Exception(The unexpected data Exception);vSystem.out.println(e.getMessage( );v执行后,程序将输出执行后,程序将输出“The unexpected data Exception”。v其他输出信息的常用方法有:其他输出信息的常用方法有:vtoString();vprintStackTrace();vtoString()方法以字符串的形式返回异常对象的字符串表示;方法以字符串的形式返回异常对象的字符串表示;printStackTrace()方法
28、将异常堆栈跟踪输出,包括异常对象方法将异常堆栈跟踪输出,包括异常对象的字符串表示和出现异常的语句标号等信息。的字符串表示和出现异常的语句标号等信息。 Company Logo8.3 自定义异常 例例8-6:自定义异常:自定义异常 class MyArrayException extends NegativeArraySizeException /自定义异常类自定义异常类 public MyArrayException(String message) super(message); /调用父类的构造方法初始化调用父类的构造方法初始化message public String getInfo()
29、/自定义方法自定义方法 String info=如看到此信息,请重新创建数组!如看到此信息,请重新创建数组!; return info; public class UserDefExceptionDemo /主类主类 static int size; static int a; /*检测数组下标的方法检测数组下标的方法*/ static void checkArraySize() throws MyArrayException if(size0) a=new intsize; System.out.println(数组创建成功!数组创建成功!); else throw new MyArrayE
30、xception(数组创建错误,请检查下标!数组创建错误,请检查下标!); public static void main(String args) size=Integer.parseInt(args0); /size值由控制台输入值由控制台输入 try checkArraySize(); 【运行步骤与结果运行步骤与结果】 catch(MyArrayException e) DOS提示符提示符java UserDefExceptionDemo 3 System.out.println(e.getMessage(); 数组创建成功!数组创建成功! System.out.println(e.getInfo(); DOS提示符提示符java UserDefExceptionDemo -2 数组创建错误,请检查下标!数组创建错误,请检查下标! 如看到此信息,请重新设定数组下标值!如看到此信息,请重新设定数组下标值! LOGO