第七章 JAVA异常处理.ppt

上传人:文库蛋蛋多 文档编号:2314546 上传时间:2023-02-11 格式:PPT 页数:59 大小:385KB
返回 下载 相关 举报
第七章 JAVA异常处理.ppt_第1页
第1页 / 共59页
第七章 JAVA异常处理.ppt_第2页
第2页 / 共59页
第七章 JAVA异常处理.ppt_第3页
第3页 / 共59页
第七章 JAVA异常处理.ppt_第4页
第4页 / 共59页
第七章 JAVA异常处理.ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《第七章 JAVA异常处理.ppt》由会员分享,可在线阅读,更多相关《第七章 JAVA异常处理.ppt(59页珍藏版)》请在三一办公上搜索。

1、第七章 JAVA异常处理,7.1异常简介,openFiles;if(theFilesOpen)determine the lenth of the file;if(gotTheFileLength)allocate that much memory;if(gotEnoughMemory)read the file into memory;if(readFailed)errorCode=-1;else errorCode=-2;else errorCode=-3;else errorCode=-4;else errorCode=-5;,缺点?程序的可读性差,维护困难。如何更改?在面向对象的编程语

2、言中,用异常处理机制来统一处理错误。,7.1异常简介,tryopenTheFile;determine its size;allocate that much memory;closeTheFile;catch(fileopenFailed)dosomething;catch(sizeDetermineFailed)dosomething;catch(memoryAllocateFailed)dosomething;catch(readFailed)dosomething;catch(fileCloseFailed)dosomething;,1.什么是异常?异常是指程序在执行过程中出现程序本身

3、没有预料到的情况,从而导致程序错误地结束。2.什么是异常处理机制?在程序运行过程中发生错误时,允许不按照正常的路径完成任务,防止错误进一步恶化。3.异常处理过程?异常是一个对象,它在程序运行时创建,并在发生错误的位置被抛出(throw),由一定的接收机制来接收并处理。,7.1异常简介,4.异常对象 异常对象是某个异常类的实例,JAVA中已定义许多异常类,并允许程序员自己创建。每种异常类对应某一种或一类错误。5.异常与if语句的区别 跳转语句可能有足够的信息指示在碰到某种问题时该如何解决,而异常必须将问题提交给一个更高级的负责人。,7.1异常简介,6.为什么要有异常处理机制?例如除法,知道有零分

4、母的情况下,可以直接使用if语句判断,但若分母是一个比较复杂计算的结果,难以预料,此时可以用异常处理。,7.1异常简介,1.JAVA异常处理机制JAVA的异常处理机制由try和catch引导,结构如下:,7.2异常处理,try 可能产生异常的代码段;catch(异常类名1 对象名1)异常处理语句1 catch(异常类名2 对象名2)异常处理语句2,2.try语句 try语句是用来包含有可能抛出异常的程序段,可以是几个简单的语句,也可以是方法的调用。如:,7.2异常处理,try function();,try int i=0;for(i=0;i100;i+),2.catch语句 catch块是专

5、门用来捕获异常的地方。try中的程序段一旦遇到异常情况,则会转到异常控制器catch.catch的结构如下:,7.2异常处理,catch(异常类名 异常形式参数名)异常处理语句组;,3.执行过程 执行时,程序用作为catch参数的异常类与try块中产生的异常对象比较,如果是该类的对象,就执行该catch语句块,否则转到下一个catch语句块,7.2异常处理,JAVA中的异常类主要来源于派生自Object类的Throwable类,该类结构如下:,7.2.1异常分类,主要方法:(1)getMessage():用来返回用带参数的构造函数创建异常时的参数内容。(2)toString():用来返回异常所

6、属的异常类名及getMessage()能得到的内容。(3)printStackTrace():在标准输出设备上打印出堆栈使用轨迹,即异常发生时已经使用了哪些类。(4)fillInStackTrace():在异常重新抛出时使用。,7.2.1异常分类,7.2.1异常分类,ArithmeticException,ArrayStoreException,Arr,ClassNotFoundException,IllegalMonitorException,NegativeArraySizeException,NullPointerException,OutOfMemoryException,IndexO

7、utOfBoundsException,IOException,类名,除数为0引起的异常,数组空间不够引起的异常,未找到指定名字的类或接口引起的异常,监控器状态出错,数组长度是负数,程序试图访问空对象中的元素,系统无法分配内存引起异常,数组下标越界,文件未找到其它读文件异常,异常处理,常见异常处理,1.概念 JAVA程序在运行时如果引发了一个可识别的错误,就会产生一个与该错误相对应的异常类的对象,这个过程称为异常的抛出。2.抛出异常的方法(1)系统自动抛出的异常 所有的系统定义的运行异常都可以由系统自动抛 出。,7.2.2抛出异常,除0错误引起的异常,7.2.2抛出异常,public stat

8、ic void main(String a)int a=0,b=5;System.out.print(b/a);,(2)语句抛出的异常 用户程序自定义的异常不可能依靠系统自动抛出,因为系统不知道错误在哪里。此时,必须借助于throw语句抛出异常。语法格式:修饰符 返回类型 方法名(参数列表)throws 异常类名列表,7.2.2抛出异常,使用throw语句抛出异常时应该注意的问题:一般这种抛出异常的语句应该被定义为在满足一定条件时执行,例如把throw定义在if语句分支中。含有throw语句的方法,应该在方法头定义中增加如下部分:throws 异常类名列表,7.2.2抛出异常,7.2.2抛出异

9、常,class JavaThrow public static void main(String args)try throw new ArithmeticException();catch(ArithmeticException ae)System.out.print(ae);,人为抛出异常例,人为抛出异常例,int deQueue()throws EmptyQueueException int data;if(isEmpty()throw(new EmptyQueueException(this);else dosomething;,7.2.2抛出异常,人为抛出异常的作用?很多时候是可以预

10、见异常的发生的,这时人为抛出异常,可使程序的逻辑清晰,功能正确。,7.2.2抛出异常,JAVA中异常处理结构:,7.3捕获异常,try 可能产生异常的代码段;catch(异常类名1 对象名1)异常处理语句1 catch(异常类名2 对象名2)异常处理语句2,当程序产生异常,就应捕获它,并进行处理,处理过程由catch语句块给出。,例子:,public class JavaThrow public static void main(String args)try throw new Throwable(Heres the Throwable);catch(Throwable e)System.o

11、ut.println(Caught Throwable);System.out.println(e.getMessage:+e.getMessage();System.out.println(e.toString:+e.toString();,注意:如果在使用能够产生异常的方法而没有捕获和处理,将不能通过编译。捕获的异常类型应该和抛出的异常类型相同,当然也可以用其父类。当满足下面三个条件之一,异常对象将被吸收:异常对象为catch参数指定的异常类的对象异常对象为catch参数指定的异常类的子类对象异常对象是实现了catch参数指定的接口的类对象,7.3.1捕获异常,因此,不能确定抛出的异常类型

12、时,可以用Exception类。例:,7.3.1捕获异常,public static void main(String args)try throw new IOException();catch(Exception e)System.out.print(caught the exception);,JAVA中经常出现的3种异常:算术异常、字符串越界和数组越界。例:,7.3.1捕获异常,public class JavaThrow public static void main(String args)char c;int a,b=0;int array=new int7;String s=H

13、ELLO;,7.3.1捕获异常,try a=1/b;catch(ArithmeticException ae)System.out.println(catch+ae);try array8=0;catch(ArrayIndexOutOfBoundsException ai)System.out.println(catch+ai);try c=s.charAt(8);catch(StringIndexOutOfBoundsException se)System.out.print(catch+se);,有时希望把刚捕获的异常重新抛出,尤其是在使用Exception捕获所有异常的时候,既然已经得到

14、了对当前异常对象的引用,可以直接把它重新抛出:,7.3.2重新抛出异常,public class JavaThrow public static void F()throws Exception System.out.println(the original exception in F();throw new Exception(thrown from F();,public static void main(String args)throws Exception try F();catch(Exception e)System.out.println(caught in main);th

15、row e;,7.3.2重新抛出异常,the original exception in F()caught in mainException in thread main java.lang.Exception:thrown from F()at JavaThrow.F(JavaThrow.java:7)at JavaThrow.main(JavaThrow.java:12)重新抛出一个异常将进入上一级结构的异常控制器中,这一层控制器后的catch将被忽略。被再次抛出的异常保留原异常的有关信息,上一层控制器可以从那个对象提取所有信息。,7.3.2重新抛出异常,与异常的起源地对应,而不是重新抛

16、出它的位置对应,7.3.2重新抛出异常,public class JavaThrow public static void F()throws Exception System.out.println(origin+the exception in F();throw new Exception(thrown from F();,public static void G()throws Throwable try F();catch(Exception e)System.out.println(Inside G(),+e.printStackTrace():);e.printStackTrac

17、e();throw e;/throw e.fillInStackTrace();,public static void main(String args)throws Throwable try G();catch(Exception e)System.out.println(caught in main,+e.printStackTrace():);e.printStackTrace();,输出结果:origin the exception in F()Inside G(),e.printStackTrace():java.lang.Exception:thrown from F()at J

18、avaThrow.F(JavaThrow.java:8)at JavaThrow.G(JavaThrow.java:14)at JavaThrow.main(JavaThrow.java:26)caught in main,e.printStackTrace():java.lang.Exception:thrown from F()at JavaThrow.F(JavaThrow.java:8)at JavaThrow.G(JavaThrow.java:14)at JavaThrow.main(JavaThrow.java:26),7.3.2重新抛出异常,问题:若程序抛出了异常,用户都想执行一

19、段固定代码,应该怎么做?答案1:把这些代码在每个异常控制器的最后复制一份。答案2:使用Finally关键词。,7.4Finally关键词,1.Finally关键词的作用:不管try块中是否抛出了异常,不管异常是否被捕获,再结束当前的异常控制结构之前,系统都会执行finally从句。2.Finally结构:,7.4Finally关键词,try 可能产生异常的代码段;catch(异常类名1 对象名1)异常处理语句1 catch(异常类名2 对象名2)异常处理语句2 finally 总会执行的语句;,7.4Finally关键词,3.例子:下面的程序执行finally子句的3种情况代码不抛出任何异常代

20、码抛出一个catch子句能够捕获的异常代码抛出一个不能被任何catch子句捕获的异常,public class FinallyWorks static int count=0;public static void main(String args)while(true)try System.out.print(count=+count+:);if(count+%2=0)throw new Exception();System.out.println(no exception);,catch(Exception e)System.out.println(Exception throw);fina

21、lly System.out.println(finally clause executed);if(count=5)break;,程序运行结果:count=0:Exception throwfinally clause executedcount=1:no exceptionfinally clause executedcount=2:Exception throwfinally clause executedcount=3:no exceptionfinally clause executedcount=4:Exception throwfinally clause executed,7.

22、4Finally关键词,异常处理并不一定要使用JAVA定义的异常类,用户可按照自己的要求自定义。定义自己的异常类必须从一个现有的异常类继承,该父类最好在含义上与新异常类近似。例子:,7.5自定义的异常,class MyException extends Exception public MyException()public MyException(String message)super(message);,public class ExceptionInheritpublic static void F()throws MyException System.out.println(“Thr

23、owing MyException);throw new MyException(the second constructor);public static void main(String args)tryF();,输出结果:Throwing MyExceptionMyException:the second constructorat ExceptionInherit.F(ExceptionInherit.java:18)at ExceptionInherit.main(ExceptionInherit.java:24),catch(MyException e)e.printStackTr

24、ace();,class MyException2 extends Exceptionprivate int i;public MyException2()public MyException2(String message)super(message);public MyException2(String message,int x)super(message);i=x;,public int value()return i;public class ExceptionInherit public static void F()throws MyException2 System.out.p

25、rintln(Throwing MyException);throw new MyException2(the third constructor,4);,public static void main(String args)try F();catch(MyException2 e)System.out.println(e.value()=“+e.value();e.printStackTrace();,输出结果:Throwing MyExceptione.value()=4MyException2:the third constructorat ExceptionInherit.F(Exc

26、eptionInherit.java:28)at ExceptionInherit.main(ExceptionInherit.java:34),7.5自定义的异常,java的异常处理涉及到程序流程的跳转,所以,虚拟机需要保存程序的执行流程,以便异常发生时能正确的跳转,这也就导致了使用异常时会引起额外的开销,所以,要谨慎地使用异常。,7.5异常使用规则,使用异常有如下几个原则:1、尽量避免使用异常,将异常情况提前检测出来。2、不要为每个可能会出现异常的语句都设置try和catch。3、避免在方法中抛出(throw)或者捕获(catch)运行时异常RuntimeException。4、避免总是c

27、atch Exception或Throwable,而要catch具体的异常类。这样可以使程序更加清晰。5、不要压制、隐瞒异常。将不能处理的异常往外抛,而不是捕获之后随便处理。6、不要在循环中使用try.catch,尽量将try.catch放在循环外或者避免使用。,7.5异常使用规则,关于第一条原则:/(1)尽量避免使用异常,将异常情况提前检测出来 Stack stack=new Stack();try stack.pop();catch(EmptyStackException e)/./应该用下面的方式,以避免使用异常 if(!stack.isEmpty()stack.pop();,7.5异常

28、使用规则,关于第二条原则:/(2)不要为每个可能会出现的一场的语句都设置try和catch try stack.pop();catch(EmptyStackExceptione)/.Stringdata=123;try Double.parseDouble(data);catch(NumberFormatExceptione)/.,7.5异常使用规则,/应该使用下面的方式,将两个语句放在一个try块中 try stack.pop();Double.parseDouble(data);catch(EmptyStackExceptione)/.catch(NumberFormatException

29、e)/.,7.5异常使用规则,关于第三条原则:/(3)避免在方法中抛出或者捕获运行时异常 RuntimeException和Error,/比如内存错误等/避免出现下面的情况 Stringarray;try array=newString1000;/array=newString1000000;此时会出现OutOfMemoryError异常 catch(OutOfMemoryErrore)throwe;/直接用下面代码 array=newString1000;,7.5异常使用规则,关于第四条原则:/(4)避免总是catchException或Throwable,而要捕获具体的异常/这样可以根据不

30、同的异常做不同的处理,使程序更加清晰 try stack.pop();Double.parseDouble(data);catch(Exceptione)/应该避免catchException!,7.5异常使用规则,关于第五条原则:/(5)不要压制、隐瞒异常。将不能处理的异常往外抛,而不是捕获之后随便处理 try Double.parseDouble(data);catch(NumberFormatExceptione)/.throwe;/抛出不能处理的异常,而不是隐瞒,7.5异常使用规则,关于第六条原则:/(6)不要在循环中使用trycatch,尽量将trycatch放在循环外或者避免使用t

31、rycatch/下面的例子在循环中使用try和catch将耗费更多的时间,尽管没有异常发生 inti=0;intntry=1000000;Stacks=newStack();longs1;longs2;System.out.println(Testingforemptystack);s1=newDate().getTime();for(i=0;i=ntry;i+)if(!s.empty()s.pop();,7.5异常使用规则,s2=newDate().getTime();System.out.println(s2-s1)+milliseconds);System.out.println(Cat

32、chingEmptyStackException);s1=newDate().getTime();for(i=0;i=ntry;i+)try s.pop();catch(EmptyStackExceptione)s2=newDate().getTime();System.out.println(s2-s1)+milliseconds);,7.5异常使用规则,练习,1.选择题(1)异常包含()A.程序中的语法错误B.程序的编译错误C.程序执行过程中遇到的事先没有预料到的情况D.程序事先定义好的可能出现的意外情况(2)对于已经被定义过可能抛出异常的语句,经编程时A.必须使用try/catch语句处

33、理异常B.如果程序错误,必须使用try/catch处理C.不使用try/catch语句会出现编译错误D.不使用try/catch语句不会出现编译错误,练习,2.编程(1)编写一个类,在main()的try块里抛出一个Exception对象,传递一个字符串参数给Exception的构造器。在catch子句里捕获此异常对象,并且打印字符串参数。添加一个finally子句,打印一条信息,证明这里确实得到了执行。(2)使用extends关键字建立一个自定义异常类。为该类写一个接受字符串参数的构造器,把此参数保存在对象内部的字符串引用中。写一个方法打印此字符串。写一个try-catch子句,对这个新异常类进行测试。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号