- 675.00 KB
- 2022-04-29 14:35:35 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'异常处理PPT课件
try-catch-finally语句,其语法格式:try{//可能发生异常的代码}catch(异常类型1变量){//<异常类型1>异常的处理代码}catch(异常类型2变量){//<异常类型2>异常的处理代码}.....finally{//总是要执行的代码}产生异常语句throw抛出异常异常类结构异常的方法finally机制2
具有异常处理的情况classExceptionDivideBy0{staticvoidmethod(){intx=0,z=10;try{inty=10/x;System.out.println("z="+z);}catch(ArithmeticExceptione){System.out.println("ArithmeticException");}System.out.println("Aftertry/catchblocks.");}publicstaticvoidmain(String[]args){method();System.out.println("Aftermethod.");}}9
ArithmeticExceptionAftertry/catchblocks.Aftermethod.10
每个异常由类Throwable或者它的一个子类的实例表示,这样的对象可被抛出并能被传递给合适的异常处理代码处理。Throwable类及其子类统称为异常类,每个异常类表示一种异常类型。Throwable类是Object类的直接子类,其本身又有两个直接子类:Error与Exception类。RuntimeException类是Exception类的直接子类,如图8-1所示。这里,Error类、RuntimeException类和Exception类分别代表某一类异常类型:8.1异常分类11
图8-1异常类型及其分类12
(1)Error类及其子类:表示灾难性的、普通程序很难恢复的异常,例如:●NoClassDefFoundError(类定义没找到异常):JVM无法找到相应的class文件。●OutOfMemoryError(内存越界异常):JVM没有足够的存储空间满足对象创建的要求。●NoSuchMethodError(调用不存在的方法异常):在改变某个方法的签名后,原先要调用该方法的应用程序,在运行时就会抛出该异常。一般情况下,程序员可不必理会这类异常,它们虽然很严重,但很少发生。13
(2)RuntimeException类及其子类:表示设计或实现方面的问题,例如:●ArithmeticException(算术运算异常):算术运算时发生的异常情况,如整数相除,除数为零。●ClassCastException(强制类型转换异常):把一个对象引用转换成一个不合适的类型,如把一个对象引用转换成某个子类类型。●NullPointerException(空引用异常):需要对象引用时使用了一个null引用。●ArrayIndexOutOfBoundsException(数组下标越界异常):下标值超出了数组大小。●NumberFormatException(数字格式异常):试图将非数字格式字符串转换成数值。14
(3)Exception类及其非RuntimeException子类:表示运行时因环境的影响而引发的异常,例如:●IOException(输入输出异常):在I/O操作失败或者被中断时引发。其子类包括:EOFException、FileNotFoundException、InterruptedIOException等。●InterruptedException(中断异常):当前等待或睡眠线程被其他线程中断时引发。这类异常并非因设计或实现引起,是无法避免的。但一般情况下,程序员应该提供相应的代码捕捉和处理。15
受检查的异常和不受检查的异常:受检查的异常Exception类及其非RuntimeException子类属于受检查的异常;受检查的异常要受编译系统的检查。如果一个方法可能会引发这类异常而又不能适当处理,那么应该用throws子句声明抛出;调用者或者用try-catch语句捕捉处理,或者也用throws子句声明抛出,并由它的调用者处理。也就是说,对方法中可能会抛出的受检查异常,程序员必须捕捉处理或声明抛出,两者必选其一,否则编译系统将给出错误信息。16
受检查的异常和不受检查的异常:不受检查的异常:类Error和类RuntimeException及其子类属于不受检查的异常,如图8-1所示。不受检查的异常不受编译系统的检查。对这类异常,程序员可以捕捉或声明抛出,但通常可以不加理会。17
异常类的方法和属性(1)异常类的构造方法publicException()创建新异常。publicException(Stringmessage)用字符串参数message描述异常信息创建新异常。(2)异常类的方法publicStringtoString()返回描述当前异常对象信息的字符串。publicStringgetMessage()返回描述当前异常对象的详细信息。publicvoidprintStackTrace()在屏幕上输出当前异常对象使用堆栈的轨迹,即程序中先后调用了哪些方法,使得运行过程中产生了这个异常对象。18
所谓异常的引发是指因程序运行出现异常情况而产生异常对象、进而转入异常处理过程的情形。Java运行系统在发现异常情况时会自动引发异常。自动引发异常如下例:8.2引发异常19
【例8-1】在发生异常情况时由运行系统引发异常classDemo{publicstaticvoidmain(String[]args){inta=args.length;System.out.println("a="+a);intb=42/a;int[]c={1};c[4]=99;System.out.println("Aftertry/catchblocks.");}}20
throw引发异常异常既可以在发生异常情况时由运行系统引发,也可以在程序中用throw语句显式引发。格式如下:thrownewArithmeticException();21
【例8-2】下面程序在被减数a小于减数b时将引发ArithmeticException异常。1)classTest{2)staticintmethod(inta,intb){3)if(a<方法名>(<参数列表>)throws<异常类型列表>{...}8.3声明抛出异常23
【例8-3】下面程序与例8-2中的程序基本相同,只是method方法可能抛出的是一个受检查的Exception异常,但它既没有捕捉也没有声明抛出,所以是不能通过编译的。1)classTest{2)staticintmethod(inta,intb){3)if(a<异常引用变量>){//<异常类型1>异常的处理代码}catch(<异常类型2><异常引用变量>){//<异常类型2>异常的处理代码}…finally{//总是要执行的代码}该语句包含try、catch和finally三个子句。其中,catch子句可以有多个,而且至少有一个catch子句或finally子句。34
try子句包含一段可能要发生异常的代码。一旦发生异常,将由后面的catch子句捕捉处理。每个catch子句有一个参数,参数类型指明该子句能够捕捉的异常类型。如果子句指定的参数类型是所发生的异常的类或者是其超类,则说明catch子句能够捕捉该异常。此时,运行系统将把异常对象的引用值传递给catch子句的参数变量,并将控制流转移到该catch子句,执行子句内的异常处理代码。之后,接着执行try语句后面的代码。如果try子句内的代码没有发生任何异常,那么跳过catch子句,直接执行try语句后面的代码。8.4.1try和catch子句35
classDemo{publicstaticvoidmain(String[]args){try{inta=args.length;System.out.println("a="+a);intb=42/a;int[]c={1};c[4]=99;}catch(ArithmeticExceptione)//捕获算术运算异常{System.out.println("Divideby0:"+e);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Arrayindexoob:"+e);}System.out.println("Aftertry/catchblocks.");}}【例8-5】try和catch子句举例36
a=0Divideby0:java.lang.ArithmeticException:/byzeroAftertry/catchblocks.37
最后说明两点:(1)当发生异常时,如果有catch捕捉到了异常,那么不管具体的异常处理代码如何(甚至不含任何语句),Java运行系统都认为该异常已被消除;(2)当执行完异常处理代码后,控制流并不会回到异常发生处,而是执行try语句后面的代码(如果没有finally子句)。38
try子句内的代码可能会发生多种类型的异常,而try语句也允许有多个catch子句,每个catch子句可以捕捉一种类型(包括子类型)的异常。当然,每次执行try语句时,至多只能抛出一个异常,相应地,至多只能有一个异常处理代码被执行。8.4.2多个catch子句39
当异常发生时,运行系统将按先后次序依次判断各catch子句,如果发现某个catch子句能够捕捉该异常,就执行其中的处理代码,而其后面的catch子句将被忽略。注意:处理子类型异常的catch子句一定要放在处理超类型异常的catch子句之前。如果将一个处理超类型异常的catch子句放在处理子类型异常的catch子句之前,或者两个catch子句捕捉同一类型的异常,编译系统都将给出错误信息。40
publicclassTest2{publicstaticvoidmain(String[]args){intx=0;inty;try{y=100/x;}catch(Exceptionex){ex.printStackTrace();}catch(ArithmeticExceptionex){ex.printStackTrace();}}}(ArithmeticExceptionex)(Exceptionex)Test2.java:9:已捕捉到异常java.lang.ArithmeticExceptioncatch(ArithmeticExceptionex)^1错误编译不通过:41
使用finally子句的好处是:控制流不管以何种原因离开try语句,都要先执行finally子句。所以,可以将那些无论是否发生异常、异常无论是否被捕捉都需要执行的代码放置在finally子句内。8.4.3finally子句42
控制流离开try语句的情况可分为以下几种:●try子句代码正常执行,没有引发异常;●try子句代码执行时引发异常,但被catch子句捕捉处理;●try子句代码执行时引发异常,但没有catch子句能捕捉处理;●try子句代码执行时引发异常,且被catch子句捕捉,但在执行异常处理代码时发生新的异常。注意:因return、break或continue等跳转语句(不管是出现在try子句中,还是出现在catch子句中)要离开try语句时,同样需要先执行finally子句。43
1)classFinallyDemo{2)staticvoidm1(inti){3)try{4)if(i==2){5)System.out.println("第2种情况:发生算术运算异常");6)thrownewArithmeticException();7)}if(i==3){8)System.out.println("第3种情况:发生数字格式异常");9)thrownewNumberFormatException();10)}if(i==4){11)System.out.println("第4种情况:发生数组下标越界异常");12)thrownewArrayIndexOutOfBoundsException();13)}14)System.out.println("第1种情况:没有发生异常");15)}【例8-9】finally子句举例44
15)catch(ArithmeticExceptione)16){System.out.println("异常被捕捉处理");}17)catch(ArrayIndexOutOfBoundsExceptione)18){System.out.println("异常被捕捉,但又被重新引发");19)throwe;}20)finally21){System.out.println("这是finally子句");}23)System.out.println("这是try语句后的代码");24)}25)publicstaticvoidmain(Stringargs[])26){for(inti=1;i<5;i++)27){try28){m1(i);}29)catch(RuntimeExceptione)30){System.out.println("由main方法捕捉到异常");}}}}45
下面是程序的输出结果:第1种情况:没有发生异常这是finally子句这是try语句后的代码第2种情况:发生算术运算异常异常被捕捉处理这是finally子句这是try语句后的代码46
下面是程序的输出结果(续):第3种情况:发生数字格式异常这是finally子句由main方法捕捉到异常第4种情况:发生数组下标越界异常异常被捕捉,但又被重新引发这是finally子句由main方法捕捉到异常47
当try子句发生异常时,如果没有一个catch子句能够捕捉到,则异常从该try语句抛出并向外传播。如果try语句本身是另外一个try语句的try子句的一部分,那么异常就由该外层try语句的catch子句捕捉处理。如果没有外层的try语句,或者外层try语句也没有catch子句能够捕捉该异常,则异常被传播到方法的调用者那里,由调用方法处理。8.4.4未捕捉到的异常48
1)classTest{//例8-7未捕捉到的异常被传播并由调用方法捕捉。2)staticvoidm1(Strings){3)try4){intx=Integer.parseInt(s);5)inty=10/x;}6)catch(NumberFormatExceptione)7){System.out.println("caught"+e+"inm1");}8)System.out.println("exitingfromm1");9)}10)publicstaticvoidmain(Stringargs[]){11)try12){m1(args[0]);}13)catch(ArrayIndexOutOfBoundsExceptione)14){System.out.println("caught"+e+"inmain");}15)catch(ArithmeticExceptione)16){System.out.println("caught"+e+"inmain");}17)System.out.println("exitingfrommain");18)}}49
该程序可以在不同情况下发生3种不同类型的异常。如果命令行不提供参数,下面是程序的输出结果:C:\>javaTestcaughtjava.lang.ArrayIndexOutOfBoundsException:0inmainexitingfrommain如果命令行的第1个参数为非数字格式字符串,下面是程序的输出结果:C:\>javaTestaaacaughtjava.lang.NumberFormatException:aaainm1exitingfromm1exitingfrommain如果命令行的第一个参数为数字0,下面是程序的输出结果:C:\>javaTest0caughtjava.lang.ArithmeticException:/byzeroinmainexitingfrommain50
try子句发生的异常可以由语句中的某个catch子句捕捉处理,但在执行catch子句内的异常处理代码时也可能再引发新的异常。此时,原先的异常被遗弃,新的异常从try语句抛出并向外传播。与"未捕捉到的异常"类似,该新异常或者由外层try语句的catch子句捕捉,或者由方法的调用者处理。8.4.5再引发异常51
1)importjava.io.IOException;//【例8-8】再引发异常举例2)classTest{3)staticvoidm1()throwsIOException{4)try5){thrownewRuntimeException("demo_1");}6)catch(RuntimeExceptione)7){System.out.println("caught"+e+"inm1");8)thrownewIOException("demo_2");}9)}10)publicstaticvoidmain(Stringargs[]){11)try12){m1();}13)catch(IOExceptione)14){System.out.println("caught"+e+"inmain");}15)System.out.println("exitingfrommain");16)}17)}52
下面是程序的输出结果:caughtjava.lang.RuntimeException:demo_1inm1caughtjava.io.IOException:demo_2inmainexitingfrommain53
8.5定义自己的异常类型自定义的异常类型必须是Throwable类的子类。只有Throwable类及其子类的实例才能够被引发和捕捉。通常将自定义异常类型定义成Exception的子类,以产生受检查的异常。Java异常处理机制的特点是方法的调用者必须认识和处理方法可能会抛出的受检查异常,而对不受检查的异常,调用者则可以不加理会。54
例:在定义银行类时,若取钱数大于余额则作为异常处理(InsufficientFundsException)。思路:产生异常的条件是余额少于取额,因此是否抛出异常要先判断该条件。确定产生异常的方法,应该在取钱方法withdrawal中产生异常InsufficientFundsException。处理异常安排在调用withdrawal的时候,因此withdrawal方法要声明异常,由上级方法捕获并处理。要定义好自己的异异常。55
publicclassInsufficientFundsExceptionextendsException{privateBankexcepbank;privatedoubleexcepAmount;InsufficientFundsException(Bankba,doubledAmount){excepbank=ba;excepAmount=dAmount;}publicStringtoString(){Stringstr="Thebalance"+excepbank.getbalance()+"Thewithdrawalwas"+excepAmount;returnstr;}}56
classBank{doublebalance;//余额publicvoiddeposite(doubledAmount)//存钱{if(dAmount>0.0)balance=balance+dAmount;}publicvoidwithdrawal(doubledAmount)throwsInsufficientFundsException{//取钱if(balance=24||m<0||m>=60||s<0||s>=60){20)thrownewTimeException(h,m,s);21)}22)hour=h;23)minute=m;24)second=s;25)}26)…27)}当用new运算符调用构造方法创建类的实例时,如果构造方法抛出异常而突然结束,那么对象的引用值不会被返回。例如:MyTimet;t=newMyTime(11,69,10);63
(1)异常是方法代码运行时出现的非正常状态,这种非正常状态使程序无法或不能再正常地继续往下运行。(2)Java采用面向对象的方法来处理异常。每当发生异常事件时,就会引发一个异常对象。运行系统根据异常对象的类型寻找相应的代码处理异常。异常对象的类型是Throwable类或其子类。(3)Java编译系统将异常分为受检查的异常(uncheckedExceptions)和不受检查的异常(checkedExceptions)两大类。8.7小结64
(4)异常引发方式:由运行系统引发,由throw语句显式地引发。(5)异常引发时,代码将不再继续往下执行,而由系统寻找合适的异常处理代码执行。当不能寻找到合适的异常处理代码时,将调用默认异常处理程序,并终止当前线程。(6)对不受检查的异常,Java程序员通常可以不加处理;而对受检查的异常,方法代码要么捕捉处理、要么通过throws子句声明抛出。(7)如果一个子类方法覆盖了一个超类方法,那么列在子类方法的throws子句(如果有的话)中的异常数目不能多于超类方法中声明的。65
(8)try语句由try、catch和finally3种子句组成:至少有一个try子句,可以有多个catch子句,而且至少有一个catch子句或finally子句。(9)try子句包含可能会抛出异常的代码;catch子句捕捉try子句代码可能抛出的异常;finally子句包含那些无论是否发生异常、异常无论是否被捕捉都需要执行的代码。(10)Java程序员可以根据需要定义自己的异常类型。自定义的异常类型一般被定义成受检查的异常类型。66
下课!Thankyou!67
'
您可能关注的文档
- 最新废水处理工中级课件PPT课件
- 最新废铜氨刻蚀液的综合回收方案研究教学课件PPT课件
- 最新度假村正面全景--精品PPT课件PPT课件
- 最新度冷丁对肠道平滑肌运动机能的影响PPT课件PPT课件
- 最新异位妊娠-中山大学课件PPT课件
- 最新异分母分数加减法3pptppt课件PPT课件
- 最新异分母分数加减法课件PPT课件
- 最新异分母分数加减法自做ppt课件PPT课件
- 最新异常分娩医学课件PPT课件
- 最新异常心电图-20032ppt课件PPT课件
- 最新异核相关谱课件PPT课件
- 最新异步电机电力拖动注册电气工程师考试课件PPT课件
- 最新异物病医学课件PPT课件
- 最新引力熵力和暗能量课件PPT课件
- 最新引子2物流的重要作用课件PPT课件
- 最新引言课件PPT课件
- 最新引领时代的思考课件PPT课件
- 最新引领者刘万凤课件PPT课件