Java异常处理.doc

上传人:scccc 文档编号:12487784 上传时间:2021-12-04 格式:DOC 页数:67 大小:684.50KB
返回 下载 相关 举报
Java异常处理.doc_第1页
第1页 / 共67页
Java异常处理.doc_第2页
第2页 / 共67页
Java异常处理.doc_第3页
第3页 / 共67页
Java异常处理.doc_第4页
第4页 / 共67页
Java异常处理.doc_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《Java异常处理.doc》由会员分享,可在线阅读,更多相关《Java异常处理.doc(67页珍藏版)》请在三一文库上搜索。

1、异常的概念 _异常异常的概念异常的分类捕获异常声明异常抛出异常创造自己的异常总结什么是异常?异常实际上是程序中错误导致中断了正常 的指令流的一种事件.没有处理错误的程序: read-file openTheFile;determine its size; allocate that much memory; closeTheFile;制作:李志涛异常的概念以常规方法处理错误openFiles;if (theFilesOpen) determine the lenth of the file;if (gotTheFileLength)allocate that much memory;if (g

2、otEnoughMeinory) read the file into memory; if (readFailed) errorCode=-l; else errorCode=l:else errorCode=-3;else errorCode=-5 ;else errorCode=-5;观察前面的程序你会发现大部分精力花在 出错处理上了.只把能够想到的错误考虑到,对以外的情况 无法处理程序可读性差出错返回信息量太少制作:李志涛异常的概念用异常的形式处理错误read-File; try openTheFile; determine its size; allocate that much m

3、emory; closeTheFile; catch (fileopenFailed) dosoinething; catch(sizeDetermineFailed) dosomething; catch(memoryAllocateFailed) dosomething; catch(readFailed) dosomething;catch(fileCloseFailed) dosomething; catch (Exception) dosoinething; /其它未考虑到的 错误制作:李志涛异常的概念异常的概念异常的概念和传统的方法比较异常的优点:1 把错误代码从常规代码中分离出来

4、2. 把错误传播给调用堆栈调3. 按错误类型和用 错误差别分组4. 系统提供了对于一些无法预测的错误的 捕获和处理5. 克服了传统方法的错误信息有限的问题制作:李志涛异常的概念什么情况下使用例外机制?.当方法因为自身无法控制的原因而不能完成其任务 文件不存在,网络连接无法建立 处理在方法、类库、类中抛出的例外/iu Fileinputstream.readjIOException在大的项目中釆用统一的方式处理例外时如编写一个文字处理器例外应该是不经常发生但却可能发生的故障 一定发生的事件不应该用例外机制来处理 例外处理用于使系统从故障中恢复 提示信息/不产生无效的结果/释放资源制作:李志涛异常

5、的概念不同的例外处理策略关键性应用(处理所有例外)实验软件(可以忽略许多例外)处理例外时的注意事项终止程序会导致资源泄漏,利用例外处理释 放资源尽可能近地处理例外,这样程序清晰易读能在局部处理的错误不要使用例外机制 例外机制的处理比正常处理效率低制作:李志涛异常的概念class ExcepTest public void main(String args) int b=0; int a;try a=5/b;catch (Arith meticExcep tion e) System.outprintln(udivided by 0"); try URL url=newURL(r;,h

6、itgir); catch(MalformedURLException e) badURL=true; repaint();制作:李志涛异常的分类异常是一个对象,它继承自Throwable类,所有的Throwable类的子孙类所产生的对象都是例外.Error:由Java虚拟机生成并抛岀,Java程序不做处 理.Runtime Exception(被0除等系统错误擞组下标 超范围):由系统检测,用户的Java程序可不做处 理,系统将它们交给缺省的异常处理程序.Exception(程序中的问题,可预知的):Java编译器 要求Java程序必须捕获或声明所有的非运行时异 常throw:用户自己产生异

7、常制作:李志涛异常的分类V i rtual Mach i neEr ror£CackOver£ IowEitoi-Aritlirret icExcept ionRuntimeExceptionMu11FointerExceptionIiiaexCutQIEounasExcept ionEOFExcept ionFi 1eNot FoundExcept ion制作:李志涛异常的分类制作:李志涛例外的分类一个例外是由一个对象来代表的,所有的例外都 直接或间接地继承自Throwable类。在Java类库的每个类包中都定义了例外类,这些 例外类分成两大类:Error类及Except

8、ion类,后者是 Java程序中需要大量处理的。除了Java类库所定义的例外类之外,用户也可以 通过继承已有的例外类来定义自己的例外类,并在 程序中使用(利用throw产生,throws声明抛出, catch捕捉并处理)。Error:由Java虚拟机生成并抛出,包括动态链接失败、 虚拟机错误等,Java程序不做处理。 Runtime Exception: Java虚拟机在运行时生成的例 外,如被0除等系统错误、数组下标超范围等,其产生比 较频繁,处理麻烦,对程序可读性和运行效率影响太大。 因此由系统检测,用户可不做处理,系统将它们交给缺省 的异常处理程序(当然,必要时,用户可对其处理)。Exc

9、eption: 一般程序中可预知的问题,其产生的例外 可能会带来意想不到的结果,因此Java编译器要求Java 程序必须捕获或声明所有的非运行时异常。制作:李志涛j ava public static void main(String args) try tes tThrowable();catchSystem .err.println(ttoString();System err printin();Uwi-QTn qxx r>-ri nbl n f fastatic void testThrowable ()测试 Throwable测试Throwable的用法。java1 ang.T

10、hzowable : 测试 Throwable 的用法。at testUntitled1 testThrowable(Untitled1 java:137) at testUntitledlmain(Untitledl java:79)public static void main(String args) try catch (Throwable t) System err printin(t toString ();System err printin( etMessage );System err.println(t getLocalizedMessage (); tprintstack

11、Trace(System .err);static void testThrowable()throw new Throwable();java lang Throwablenullnulljava lang Throwable制作: 李志涛七 test .Untitled 1 tes tThrowable (Untitled 1 java: 137) at testUntitiedl.main(Untitled1 java:7 9)例外的分类例外示例: 観瞬豔讒序中必须对其进行处理, 将不SSli?产生异常的方法而没有捕获和处理,程序歸勰鼬程序中可以不做处理'直接由捕获异常捕获并处理

12、异常 try /接受监视的程序块,在此区域内发生 /的异常,由catch中指定的程序处理;不能有其它语句分隔catch (要处理的异常种类和标识符)/处理异常; catch (要处理的异常种类和标识符)/处理异常;制作:李志涛捕获例外 try语句捕获例外的第一步就是用try .语句指定了一 段代码,该段代码就是一次捕获并处理例外的范围。 在执行过程中,该段代码可能会产生并抛弃一个或 多个例外,因此,它后面的catch语句进行捕获时也 要做相应的处理。如果没有例外产生,所有的catch代码段都被略过 不执行。制作:李志涛捕获例外 catch语句每个try语句必须伴随一个或多个catch语句,用于

13、捕获try 代码块所产生的例外并做相应的处理。catch语句有一个形 式参数,用于指明其所能捕获得例外类型,运行时系统通过 参数值把被抛弃的例外对象传递给catch语句。程序设计中要根据具体的情况来选择catch语句的例外处 理类型,一般应该按照try代码块中例外可能产生的顺序及其 真正类型进行捕获和处理,尽量避免选择最一般的类型作为 catch语句中指定耍捕获的类型。当然也可以用一个catch语句处理多个例外类型,这时它 的例外类型应该是这多个例外类型的父1 ,但这种方式使得 在程序中不能确切判断例外的具体类型。例外总是由距离产生例外最近的匹配catch代码段处理 如果没有相应的例外处理,则

14、例外被交给上一层try代码段进行处理例外处理的查找依据类型匹配原则顺序进行第一个匹配的例外处理被执行,当例外处理执行完毕,程序 接着最后一个catch代码段后的语句执行catch(Exception e)捕获所有Exception catch(Throwable t)捕获 Exception 和Error例外处理的顺序影响到例外的处理子类例外可被父类例外处理捕获不要先捕获父类例外,再捕获子类例外如果找不到相应的例外处理非GUI程序将结束程序执行; Applet或GUI程序则回复到事件处理状态制作:李志涛捕获例外cat ch语句尽量避免用一般类型作为catch中指定要捕获的类型。 一般应该按照t

15、ry代码块中例外可能产生的顺序及其真正类型 进行捕获和处理,在例外处理中无法访问try代码段中声明的变量因为此时try代码段已经退出了,例外处理所需要的任何信息 一般都应该通过例外对象来传递在使用方法时尽量直接处理该方法可能产生的例外这样你的程序就会更健壮在使用库方法之前,应该先仔细阅读说明文档那里会介绍方法可能产生的例外以及例外产生的条件-在使用各种例外类之前也应该先仔细阅读说明文档那里会介绍例外的具体含义及例外产生的条件捕获例外cat ch语句在catch代码段中产生的例外不是由相同try的后续 catch代码段处理,而是由包含整个try-catch结构的上 层try代码段检测并处理可以把

16、catch到的例外对象再次抛出,使上层try-catch 结构继续处理该例外事件;也可以把例外对象转换为 其它例外对象 catch (Exception e) throw e; try-catch机制不该被用于流程控制,例外情形应该是 很稀少的,而不是经常性的在catch代码段中的return语句用于退出方法,而不是 返回到例外抛出点(throwpoint)制作:李志涛捕获异常制作:李志涛如果在使用能够 产生异常的方法 而没有捕获和处 理,将不能通过 编译常见的异常ArithmeticException /算术异常 比如被零除ArraylndexOutOfBoundsException/数组下

17、标越界ArrayStoreException/放入数组的类型不符IOExcept ion/I/O 异常FileNotFoundException找不到文件异常NullPointerException/空指针异常Mai f or in e dURLEx c e p t i on/ ur 1 无法解析异常NuinberFormatException/字符串转换数值异常捕获异常-例:编写Java程序,包含三种异常算术异常,字符串越界,数组越界观察输出信息:每个异常对象可以直接给出信息制作:李志涛捕获异常 public static void main(String args) char c; int

18、 a,b=0;int array=new int7;String s="Hello"try a=l/b; catch(ArithmeticException ae)J System, out printing4 Catch “+ae);try array8=0; catch(ArrayIndexOutOfBoundsException ai) System.out.println(uCatch “+ai);try c=s.charAt(8); catch(StringIndexOutOfBoundsException se) System.outprintln(uCatch

19、 u+se);捕获异常 一定会执行的程序块finally异常处理的统一岀口 try /常规的代码;catch () /处理异常finally /不论发生什么异常(或者不发生任何异常),都 要执行的部分;捕获例外 finally 语句捕获例外的最后一步是通过行nally语句为例外处理提供一 个统一的岀口,使得在控制流程转到程序的其他部分以前, 能够对程序的状态作统一的管理。无论try所指定的程序块中是否抛出例外,也无论catch 语句的例外类型是否与所抛弃的例外的类型一致,finally所 指定的代码都要被执行,它提供了统一的出口。(finally 句与switch中的default语句是不同的

20、!)通常在finally语句中可以进行资源的清除工作,如关闭打 开的文件、删除临时文件等。制作:李志涛声明异常一个方法不处理它产生的异常,而是沿着调用层次 向上传递,由调用它的方法来处理这些异常,叫声 明异常.声明异常的方法在产生异常的方法名后面加上要抛出(throws)的 异常的列表 void compute(int x)throwsAtit hme ticExcep tion returnTvpe methodName(parameterlist)throws exceptionList制作:李志涛声明异常例喏因 某种原 因不想 在创建URL的 方法中 处理异 常public int co

21、mpute(int x) throwsArithmeticException e) return z=100/x;public methodl() int x;try x=System>in.read(); compute(x); catch(IOException ioe) System.ouLprintln(read error); catch(ArithmeticException e) System.outprintlnCMevided by 0”); 制作:李志涛声明异常制作:李志涛声明异常例:说出程序执行结果public class exception! void Proc(

22、int sei) throwsArithmeticException, ArraylndexOutOfBoundsException System.out.printlnCcIn Situation11 + sei );if (sel=0) System.out.printin(Hno Exception caught11); return;else if(sell) int iArray=new int5;i Array 10二3;制作:李志涛aaiBBOHBMt MHBWMM声明异常 置public static void main(String args ) try Proc(O);Pr

23、oc(l);catch(ArrayIndexOutOfBoundsException e) System.out.println(nCatchn+e);c:>java throwsExceptionIn Situation 0 no Exception caughtIn Situation 1Catchjava. lang. ArraylndexOutOfBoundsException:10抛出异常抛弃异常:不是出错产生,而是人为地抛出 throw ThrowableObject; throw new ArithmeticException();例:编写程序人为抛出(JavaThrow.

24、prj)ArithmeticException,ArraylndexOutOfB oundsExceptionStringlndexOutOfBoundsExceptionA method(Exception) Another method抛出异常class JavaThrow public static void main(String args)' try throw new ArithmeticException(); catch(ArithmeticException ae) System.out.println(ae);try throw newArrayIndexOutOf

25、BoundsException(); catch(ArrayhidexOutOfBoundsException ai) System.out.println(ai);try throw new StringIndexOutOfBoundsException(); catch(StringfiidexOutOfBoundsException si) System.out.println(si);抛出例外任何从Throwable派生的类对象都可以用throw语句抛 出,抛出例外用来表明程序遇到的错误无法正常执行 而需要例外处理 throw new MyException(usome infomat

26、ion”);例外可以由try代码段中的语句抛出也可以从被try代码段中调用的方法中抛出例外还可能产生于数组下标越界以及Java虚拟机内部错误等Exception和Error是Throwable的直接派生类 Exception,程序应该处理的例外 Erro表系统严重错误,一般程序不处理这类错误例外抛出点后的代码在抛出例外后不再执行也可以说例外的抛出终止了代码段的执行制作:李志涛创造自己的异常不是由Java系统监测到的异常(下标越界,被 0 除等),而是由用户自己定义的异常.用户定义的异常同样要用try-catch捕获,但 必须由用户自己抛出throw newMyException.异常是一个类,

27、用户定义的异常必须继承自Throwable 或 Exception 类,建议用 Exception 类.制作:李志涛创造自己的异常形如: class MyException extends Exception ;例1:计算两个数之和,当任意一个数超岀范围时,抛 出自己的异常public class NumberRangeException extendsException public NumberRangeException(String msg) super(msg); public int CalcAnswer(String strl, String str2) throws Numbe

28、rRangeExceptionint intl9int2;int answer =tryinti = Integer.parselnt(str 1);int2 = Integer.parselnt(str2);if(inti v 10) II (inti > 20川(int2 < 10) | (int2 > 20) NumberRangeException e = new N umberRangeException (Numbers not within the specified range.H);throw e;answer = inti + int2; catch (N

29、 umberF ormatException e)System.out.println( e);return answer;public void getAnswer()String answerStr;tryint answer = CaleAnswer(u “5”); answerStr = String.valueOf(answer);catch (NumberRangeException e) answerStr = e.getMessage();SystenieOutprintln (answerStr);制作:李志涛创造自己的异常例2 :在定义银行类时,若取钱数大于余额则作为 异常

30、处理(InsufficientFundsException).思路:产生异常的条件是余额少于取额,因此是 否抛岀异常要判断条件取钱是withdrawal方法中定义的动作,因此在该 方法中产生异常.处理异常安排在调用withdrawal的时候,因此 withdrawal方法要声明异常,由上级方法调用要定义好自己的异常类制作:李志涛小结1. 一般格式:正常程序和出错处理分离开来 try Java statement;catch(ExceptionType1 Exceptionobject) Exceptionl handling; catch(ExceptionType2 Exceptionobject) Exception2 handling; Jfinally final handling;/ (统一的出口,最终必定要执行) 2把异常传播给堆栈,沿着被调用的顺序往前 寻找,只要找到符合该异常种类彻底异常处理 程序,就交给这部分程序去处理制作:李志涛小结3.异常可以人为地抛出,用throw new语句5异常可以是系统已经定义好的,也可以是 用户自己定义的5用户自己定义的异常一定继承自Throwable 或 Exception 类作业当用户输入“T”或“t”时,人为抛出一个自定 义异常,处理方式为打印岀错信息制作:李志涛

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1