《异常处理》PPT课件.ppt
《《异常处理》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《异常处理》PPT课件.ppt(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章第八章 异常处理异常处理(Exception)8.1 异常分类异常分类8.2 引发异常引发异常8.3 声明抛出异常声明抛出异常8.4 捕捉异常捕捉异常8.5 定义自己的异常类型定义自己的异常类型8.6 构造方法与异常处理构造方法与异常处理8.7 小结小结1try-catch-finally语句语句,其语法格式:其语法格式:try /可能发生异常的代码可能发生异常的代码 catch(异常类型异常类型1 变量)变量)/异常的处理代码异常的处理代码 catch(异常类型异常类型2 变量)变量)/异常的处理代码异常的处理代码 .finally /总是要执行的代码总是要执行的代码 产生异常语句th
2、row抛出异常异常类结构异常的方法finally机制2异常异常(例外例外)是方法代码是方法代码运行时出现的非正常状态运行时出现的非正常状态,这种,这种非正常状态使程序无法或不能再正常地继续往非正常状态使程序无法或不能再正常地继续往下运行。下运行。常见的异常:常见的异常:数组下标越界数组下标越界 除数为零除数为零 内存溢出内存溢出 文件找不到等。文件找不到等。3运行机制:运行机制:当一个方法在当一个方法在运行时发生异常运行时发生异常时,将时,将产生产生相应类型相应类型的一个的一个异常对象异常对象、中止代码继续往下、中止代码继续往下运行并寻找相应的异常处理代码。运行并寻找相应的异常处理代码。异常处
3、理:异常处理:1 判断异常类型判断异常类型2 产生对象产生对象3 捕获处理异常捕获处理异常4寻找相应的异常处理代码的过程:寻找相应的异常处理代码的过程:1当前方法当前方法2直接或间接调用者直接或间接调用者3找到,传递异常对象并进行异常处理找到,传递异常对象并进行异常处理4没有找到,调用没有找到,调用默认的异常处理程序,中默认的异常处理程序,中止当前线程止当前线程 6举例(没有异常处理的情况)举例(没有异常处理的情况)1)class ExceptionDivideBy0 2)static void method()3)int x=0,z=10;4)int y=10/x;5)System.out.
4、println(z=+z);6)7)public static void main(String args)8)method();9)System.out.println(After method.);10)11)7Exception in thread main java.lang.ArithmeticException:/by zero at ExceptionDivideBy0.method(ExceptionDivideBy0.java:4)at ExceptionDivideBy0.main(ExceptionDivideBy0.java:8)Press any key to con
5、tinue.8具有异常处理的情况具有异常处理的情况class ExceptionDivideBy0 static void method()int x=0,z=10;try int y=10/x;System.out.println(z=+z);catch(ArithmeticException e)System.out.println(ArithmeticException);System.out.println(After try/catch blocks.);public static void main(String args)method();System.out.println(A
6、fter method.);9ArithmeticExceptionAfter try/catch blocks.After method.10每个异常由类每个异常由类Throwable或者它的一个子类的实例表或者它的一个子类的实例表示,这样的示,这样的对象可被抛出并能被传递给合适的异常处对象可被抛出并能被传递给合适的异常处理代码处理理代码处理。Throwable类及其子类统称为异常类,类及其子类统称为异常类,每个异常类表示一种异常类型。每个异常类表示一种异常类型。Throwable类是类是Object类的直接子类,其本身又有两类的直接子类,其本身又有两个直接子类:个直接子类:Error与与E
7、xception类。类。RuntimeException类是类是Exception类的直接子类,如类的直接子类,如图图8-1所示。这里,所示。这里,Error类、类、RuntimeException类和类和Exception类分别代表某一类异常类型:类分别代表某一类异常类型:8.1 异常分类异常分类11图图8-1 异常类型及其分类异常类型及其分类12(1)Error类及其子类:类及其子类:表示灾难性的、普通程序很表示灾难性的、普通程序很难恢复的异常,例如:难恢复的异常,例如:NoClassDefFoundError(类定义没找到异常):(类定义没找到异常):JVM无法无法找到相应的找到相应的c
8、lass文件。文件。OutOfMemoryError(内存越界异常):(内存越界异常):JVM没有足够的没有足够的存储空间满足对象创建的要求。存储空间满足对象创建的要求。NoSuchMethodError(调用不存在的方法异常):(调用不存在的方法异常):在改变在改变某个方法的签名后,原先要调用该方法的应用程序,在运行某个方法的签名后,原先要调用该方法的应用程序,在运行时就会抛出该异常。时就会抛出该异常。一般情况下,程序员可不必理会这类异常,它们一般情况下,程序员可不必理会这类异常,它们虽然很严重,但很少发生。虽然很严重,但很少发生。13(2)RuntimeException类及其子类:类及其
9、子类:表示设计或实现表示设计或实现方面的问题,例如:方面的问题,例如:ArithmeticException(算术运算异常):(算术运算异常):算术运算时发生算术运算时发生的异常情况,如整数相除,除数为零。的异常情况,如整数相除,除数为零。ClassCastException(强制类型转换异常):(强制类型转换异常):把一个对象引把一个对象引用转换成一个不合适的类型,如把一个对象引用转换成某个用转换成一个不合适的类型,如把一个对象引用转换成某个子类类型。子类类型。NullPointerException(空引用异常):(空引用异常):需要对象引用时使需要对象引用时使用了一个用了一个null引用
10、。引用。ArrayIndexOutOfBoundsException(数组下标越界异常):(数组下标越界异常):下标值超出了数组大小。下标值超出了数组大小。NumberFormatException(数字格式异常):(数字格式异常):试图将非数试图将非数字格式字符串转换成数值。字格式字符串转换成数值。14(3)Exception类及其非类及其非RuntimeException子类子类:表表示示运行时因环境的影响而引发的异常运行时因环境的影响而引发的异常,例如:,例如:IOException(输入输出异常):(输入输出异常):在在I/O操作失败或者被中操作失败或者被中断时引发。其子类包括:断时引
11、发。其子类包括:EOFException、FileNotFoundException、InterruptedIOException等。等。InterruptedException(中断异常):(中断异常):当前等待或睡眠线程当前等待或睡眠线程被其他线程中断时引发。被其他线程中断时引发。这类异常并非因设计或实现引起,是无法避免的。这类异常并非因设计或实现引起,是无法避免的。但一般情况下,但一般情况下,程序员应该提供相应的代码捕捉和处程序员应该提供相应的代码捕捉和处理理。15受检查的异常和不受检查的异常:受检查的异常和不受检查的异常:受检查的异常受检查的异常 Exception类及其非类及其非Ru
12、ntimeException子类属于受检子类属于受检查的异常;查的异常;受检查的异常要受编译系统的检查受检查的异常要受编译系统的检查。如果一个方法。如果一个方法可能会引发这类异常而又不能适当处理,那么应该用可能会引发这类异常而又不能适当处理,那么应该用throws子句声明抛出;调用者或者用子句声明抛出;调用者或者用try-catch语句捕语句捕捉处理,或者也用捉处理,或者也用throws子句声明抛出,并由它的调子句声明抛出,并由它的调用者处理。用者处理。也就是说,也就是说,对方法中可能会抛出的受检查异常,对方法中可能会抛出的受检查异常,程程序员必须捕捉处理或声明抛出,两者必选其一序员必须捕捉处
13、理或声明抛出,两者必选其一,否则,否则编译系统将给出错误信息。编译系统将给出错误信息。16受检查的异常和不受检查的异常:受检查的异常和不受检查的异常:不受检查的异常:不受检查的异常:类类Error和类和类RuntimeException及其子类属于不受检及其子类属于不受检查的异常,如图查的异常,如图8-1所示。所示。不受检查的异常不受编译系统的检查。对这类异常,不受检查的异常不受编译系统的检查。对这类异常,程序员可以捕捉或声明抛出,但通常可以不加理会。程序员可以捕捉或声明抛出,但通常可以不加理会。17异常类的方法和属性异常类的方法和属性(1)异常类的构造方法异常类的构造方法 public Ex
14、ception()创建新异常。创建新异常。public Exception(String message)用字符串参数用字符串参数message描述异常信息创建新异常。描述异常信息创建新异常。(2)异常类的方法异常类的方法public String toString()返回描述当前异常对象信息的字返回描述当前异常对象信息的字符串。符串。public String getMessage()返回描述当前异常对象的详细返回描述当前异常对象的详细信息。信息。public void printStackTrace()在屏幕上输出当前异常对象在屏幕上输出当前异常对象使用堆栈的轨迹,即程序中先后调用了哪些方
15、法,使使用堆栈的轨迹,即程序中先后调用了哪些方法,使得运行过程中产生了这个异常对象。得运行过程中产生了这个异常对象。18所谓异常的引发是指因程序运行出现异常情况而产生所谓异常的引发是指因程序运行出现异常情况而产生异常对象、进而转入异常处理过程的情形。异常对象、进而转入异常处理过程的情形。Java运行运行系统在发现异常情况时会自动引发异常。系统在发现异常情况时会自动引发异常。自动引发异常自动引发异常 如下例如下例:8.2 引发异常引发异常19【例【例8-1】在发生异常情况时由运行系统引发异常】在发生异常情况时由运行系统引发异常class Demo public static void main(
16、String args)int a=args.length;System.out.println(a=+a);int b=42/a;int c=1;c4=99;System.out.println(After try/catch blocks.);20throw引发异常引发异常 异常既可以在发生异常情况时由运行系统引发,异常既可以在发生异常情况时由运行系统引发,也可以在程序中也可以在程序中用用throw语句显式引发语句显式引发。格式如下:格式如下:throw new ArithmeticException();21【例【例8-2】下面程序在被减数】下面程序在被减数a小于减数小于减数b时将引发时
17、将引发ArithmeticException异常异常。1)class Test 2)static int method(int a,int b)3)if(a b)4)throw new ArithmeticException(a b);/产生异常产生异常5)return a-b;6)7)public static void main(String args)8)method(3,5);9)10)下面是该程序的输出结果:下面是该程序的输出结果:Exception in thread main java.lang.ArithmeticException:a bat Test.method(Test
18、.java:4)at Test.main(Test.java:8)22如果一个方法引发的是受检查的异常且自己没有捕捉,如果一个方法引发的是受检查的异常且自己没有捕捉,那么它必须用那么它必须用throws子句声明抛出;子句声明抛出;该方法的该方法的调用者调用者如果不对异常进行捕捉,那么也必须如果不对异常进行捕捉,那么也必须用用throws子句声明抛出。子句声明抛出。下面是包含下面是包含throws子句的方法定义的语法格式:子句的方法定义的语法格式:()throws .8.3 声明抛出异常声明抛出异常23【例【例8-3】下面程序与例】下面程序与例8-2中的程序基本相同,只是中的程序基本相同,只是m
19、ethod方方法可能抛出的是一个受检查的法可能抛出的是一个受检查的Exception异常,但它既没有捕异常,但它既没有捕捉也没有声明抛出,所以是不能通过编译的。捉也没有声明抛出,所以是不能通过编译的。1)class Test 2)static int method(int a,int b)3)if(a b)4)throw new Exception(a b);5)return a-b;6)7)public static void main(String args)8)int r=method(3,5);9)System.out.println(r=+r);10)11)throws Except
20、ion throws Exception 24 对不受检查的异常,同样可以声明抛出(或进行对不受检查的异常,同样可以声明抛出(或进行捕捉),这在语法上是允许的。捕捉),这在语法上是允许的。无论是受检查的异常还是不受检查的异常,对不无论是受检查的异常还是不受检查的异常,对不受检查的异常,不管是否声明了异常抛出,异常一旦受检查的异常,不管是否声明了异常抛出,异常一旦引发,其处理过程是一致的,即:引发,其处理过程是一致的,即:异常沿着方法调用异常沿着方法调用的反方向传播,寻找并转入合适的异常处理代码执行。的反方向传播,寻找并转入合适的异常处理代码执行。如果方法及其所有的调用者都没有提供合适的处理代如
21、果方法及其所有的调用者都没有提供合适的处理代码,那么异常将最终传播到运行系统,运行系统调用码,那么异常将最终传播到运行系统,运行系统调用默认的异常处理代码后终止程序执行。图默认的异常处理代码后终止程序执行。图8-2说明了例说明了例8-2和例和例8-3中异常引发和传递的过程。中异常引发和传递的过程。25图图8-2 异常传播过程示意图异常传播过程示意图26回忆超类和子类中方法覆盖的要求:回忆超类和子类中方法覆盖的要求:1两个方法具有相同的方法签名(即方法名和方两个方法具有相同的方法签名(即方法名和方法的参数完全一致)法的参数完全一致)2返回类型相同返回类型相同3覆盖方法的访问级别不能低于被覆盖方法
22、的访覆盖方法的访问级别不能低于被覆盖方法的访问级别问级别4覆盖方法覆盖方法(子类方法子类方法)不能比被覆盖方法不能比被覆盖方法(超类方超类方法法)抛出更多类型的受检查异常抛出更多类型的受检查异常。下面通过例子加以说明。下面通过例子加以说明。27【例【例8-4】有以下类定义:】有以下类定义:1)import java.io.*;2)3)class TestClass4)void testM(BaseClass o)throws IOException5)o.method();7)8)9)class BaseClass10)void method()throws IOException11).12
23、)28请问下面哪些请问下面哪些BaseClass类的子类定义类的子类定义是合法的?是合法的?A)class A extends BaseClass void method()throws IOException B)class B extends BaseClass void method()throws Exception C)class C extends BaseClass void method()throws EOFException,FileNotFoundException 29D)class D extends BaseClass void method()throws IOE
24、xception,InterruptedException E)class E extends BaseClass void method()F)class F extends BaseClass void method()throws IOException,NullPointerException 30【例2.10】从键盘输入一个整数和实数,并输出它们的和 import java.io.*;/引入引入java.io包包class InputDemo public static void main(String args)throws IOException /用标准输入创建一个用标准输入创
25、建一个 BufferedReaderBufferedReader br=new BufferedReader(new InputStreamReader(System.in);System.out.print(请输入一个整数:请输入一个整数:);String str=br.readLine();/输入字符行存入字符串输入字符行存入字符串int i=Integer.parseInt(str);/转换字符串为整型数据转换字符串为整型数据31 System.out.print(请输入一个实数:请输入一个实数:);str=br.readLine();float f=Float.parseFloat(s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 异常处理 异常 处理 PPT 课件
限制150内