Java语言基础教程(张化祥):第七章异常处理(精)_第1页
Java语言基础教程(张化祥):第七章异常处理(精)_第2页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、甲第7章异常处理异常是指程序在运行时发生的错误.通过卩片处理机制.我们町以用一 种结构化的町控方式來处理运行时地错误尽管大多数高级程序设计语言都 提供了 -些斤A处理机制.但Java中的异常处理机制I匕JI它语言提供的 简沽、更灵活。在Java中.所有的异常都用类來衣示。所有的异常类都是从java.langtl中的Throwable继承Hu來的。Error和Except ion1. ErrorError用來以示编译和运行错误如程履进入死循环、内存溢出竽.Error只能在编译阶段解决.运行时棉序本身无法解决.只能依辂比它程序的F预.否则会 点处p非正常状态Error处理一般由系统承拒,Java木

2、十仆 提供相应的Error处理机制。2. ExceptionException川來左小由心序沾动所导致的钻泯,如运毎时除数为0、打幵 个文件时发规文件不/ 小 X 細F运彳j山现Exception时 程庁;屮加 入H滋处理化仍可檢程序继续运行和金和Y结束。异常处理机制正是 针对Exception的Throwab 1 e的方法Throwable中足义多个方法。因为所有的丹常啖都足Th rowable的子类. 所以它们都继承了Throwable的这空方法Throwable filllnStackTraceO:返冋个包含调用找息的Throwable对 g 该对彖可以被IE新抛出。void print

3、StackTrace():将调用栈信息输出到标准错谋。String geiMessage():返回对杲常的描述。String getLocalizedMessage。;返冋对界常的木地描述。String toString():返冋 个包含丹常摘述的String对彖。右异常的产生Java中的并常处理机制看似十分的縈琐.实际使用时却并不复杂。卜面 介绍个简饥的卑本异常:dass Throwl(public static void main(String args) int a-new int4J;System.out.println(Befbre exception1*);a8-12;/T 个数纽

4、卜标越界界常Systemout.printlnCAfter exception!);输出结果:Followed by exception!Exception in thread main java.Iang.ArraylndexOutOfBoundsException: 8 atThrowl.main(Throwl.java:5)上例中产牛了一个数纽卜标越界亓常.它足RuntimeExceptionfi catch(ArTayIndexOutOfBoundsExcepbon e)System.out.printinCArraylndexOutOfBoundsExcepbon caught!1)

5、; catch(ArithmeticException e)System.out.printin(nArithmeticExceptio n caught!);System.out.printin(HEnd up!);输出结果:Before excepbon!ArrayIndexOutOfBoundsException caught!End up!运行结果中对以看出上例try块中产牛了一个数组卜标越界开常.这个 异常对獄被第 个catch语句捕获并处理.第二个catch语句则被M接跳过. 紧接若执行了catch语句后而的输出语句。class Trylpublic static void mai

6、n(Stnng argsX如果try块中没仃抛出丹常.那么try块就会全部执行结束.丿门I.会跳过 它的所有catch语句.从最后个catch后血的第个语句继续执行.例如:dass Try2public static void main(String args)int a-new int4);trya0=12;System.out.pnntin( No!M);catch(ArrayIndexOutOfBoundsException e)System.out.prinHn(ArrayIndexOutOfBoundsEx8ption caught!*); System.out.println(nE

7、nd upP);输出结果:Will exception be gen erated?No!End up!try代码块中对能会抛出个或多个杲常.我们要针对每个町能发牛的杲 常,准备相应的异常处理程序.例如dass Try3pubic static void main(String args)int a-6/7rl6/25/43/48/55f76;int b-3f0A5r0f8;fbr(int i=0;ia.length;i*4-)吹System.out.println(ai+T4-bi4-,is,+ai/bi);catch(ArithmeticExcepbon e) System-outprin

8、ti1Cant divide by zero!*1);catch(ArTayIndexOutOfBound$Exceptione)System.out.pnntlnCNomatching element fbundr,);输出结果:6/3 is 2Cant divide by zero!16/4 is 425/5 is 5Cant divide by zero!48/8 is 6No matching element found! No matching element found!捕获所有异常X 抛出丹常的时候,Java会从上向卜分别对毎个catch句处理的井常类 烈进行检测.然后按照代码的

9、书写顺序找出“昴近”的处理程序。 找到匹配 的处理糧序Z丿二 它便认为畀常将得到处理,然后就不在继续件找。含找的 时候并彳、嘤求抛出的片常同处理程序所0名的并常完全匹配。派生类的対彖 也町以匹配其卑类的处理稈序。例如:dass Try4pubic static void main(String args) int a-6/7rl6z25/43/48/55f76; intb 3O4,5O8; fbr(inti=O;in e)System.out.printlnCArithmeticException caughtP); System.out.printlnCEnd up!);输出结果:Befor

10、e throw!ArithmeticExcepbon caught! End up!由catch语句捕获的异常町以重新拋出以使外部catch语句町以捕获它。呎新抛出的1:要原因尼为了允许多个斤常处理卅序访问丹常。匝抛叶常会把 片滋抛给上一级环境中的界常处理程丿乩 高一级环境中捕获此片桔的处刃R序町以从这个异常对篆中得到所有信息。dass UseRethrow public static void t() try System.ouLpnntin(Bofore excepbon!*); throw newAnthmeticException(); catch(ArithmeticExceptio

11、n e)System.out.pnntin(An th me tic Exception caught!”); throw e;重新抛出异常dass RethrowDemo public static void main(String args) tryUseRethrow.t();catch(AnthmeticExceptione) System.out.pnndn(Caught agai n!”);输出结果:Before exception!ArithmeticException caught!Caught again!ArraylndexOutOfBoundsExceptionTl:方法

12、t()屮被匝新抛出 乂存main()中被再次捕获。finally对丁一些代码,町能会希笔无论try块中的界常是否被抛出,它们都能得 到执行为了在退出try/catch代码块时指足-个嘤执行的代码块,町以在井 常处理用序后而加1 finallyfhj包Afinally的try/catch的展木形式如卜所示:try 可能产牛片常的代码 catch (Typel e) /对汗常类Wypel的丹常处理代何Finally/ iUllitry/catch代码块兀冬执仃的代码class Usefnally2 plk static gd t() Gt aLJ=new nt4; try System x) )u

13、t.prntln(*Caught aganf);输出结果:Before excepbon!ArrayIndexOutOfBoundsException caught!In finally clause!Caught again!上例中内层 B 块抛出了界常,亦lly块中的语句得到了执彳亍。再将程序修 改一下。将程序屮的这一行F8“0;改为 7“0八 此时没仃界常抛出, 运行结果如卜:Before exception! In finally clause!可见无论是出F何种原因,只耍离开try/cateh代码块,就会执行finally代 码块。System.out.printinCBefore

14、exceptton!*);8-10;throw e;otd mabi(String args)异常说明在菜叹情况卜,如果个方法产牛白己不处理的并常它就必须在throws子句中声名该异常.这就是亓常说叽 它属于方法声名的一部分紧 跟住形式参数列衣Z后。包金throws/句的力法的丛木形式如卜:retumType methodname(/*angument list*/)throwsexceptionList /method body此处.exceptionList足 个方法对能会抛出的斤常的列衣,乞个界常Z间用逗号隔开。凡是RuntimeException及H子类的斥常都不必在列衣中折定。 它们

15、被称 为U砂检查的并常”O H它类型斤常的处理都是山编译器强制实施的。这 种杲常被称为“被检査的异常Odass Throws Demo public stabc void t() throws ExceptionSystem.out.printin(MBefore throw!);throw new Excepbon(); public static void main(String args)catch(Excepton e)System.out.printinC Exception caught!);输出结果:Before throw!Exception caught!尽nJava的内轻丹常处理大笋数常见的错误,但足Java的并常处理机制并不局限于处理这陀钳头 我们可以自己足义异常类*衣示程序中可能会 遇到的特定问題创建个岸常类很容易,只需定义个Exception的子 即町。建工新的并常类熨最简单的力法就是让编译器为你产生缺省构造器,所以这儿乎不用养名少代码.还町以进一步自疋义界常比如町以为界常类 定义个接爱字符串翁数的构造器。例如:dass My Exception 1 extends Exception public dass DefExcepbonlpublic

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论