JAVA异常精.docx
《JAVA异常精.docx》由会员分享,可在线阅读,更多相关《JAVA异常精.docx(14页珍藏版)》请在冰豆网上搜索。
![JAVA异常精.docx](https://file1.bdocx.com/fileroot1/2022-12/1/880fe453-d083-45a8-8f7c-bd9a360611be/880fe453-d083-45a8-8f7c-bd9a360611be1.gif)
JAVA异常精
第6章“va的异常处理机制
■6.1异常的含义及分类
■6.2异常处理
■6.3两种抛出异常的方式
■6.4自定义异常
■6.5常见异常
6・1异常的含义及分类
■1.异常的含义
所谓异常就是程序运行时可能出现一些销溟,比如试图打开一个根本不存在的文件等
■2.异常处理的必要性
传统错误处理的不足之处,主要表现为:
(1)程序复杂;
(2)可靠性差;(3)返回信息有限;(4)返回代码标准化困难.
Java语盲猱用错误代码和异常处理相结合的方式可以把错误代码与常規代码分开,也可以在catch中传播错误信息,还可以对错误类型分组.
6・1异常的含义及分类
■3.异常的分类
在java语盲中,异常是一个对象,它继承于Throwable类,所有的Throwable类的子孙类所产生的对象都是例外(异常).从Throwable直接派生出的异常类有Exception和Error,如图6T所示.
Throwable
ErrorException
RuntimeExceptionContingencyException
图6・1Java片常址次图
6・1异常的含义及分类
■Exception長代表了真正实际意义上的异常对象的根基类.Exception和从它派生而来的所有异常都是应用程序能够捕荻到的,并且可以进行异常错误恢复处理的异常类型.
•Error则表示出现了一个非常严重的异常错误,并且这个错误可能是应用程序所不能恢复的,例如LinkageError,或ThreadDeath等.由Java虔拟机生成并抛出,Java程序不做处理.
■java.long.Error和java.lang.RuntimeException的子类免于编译时的检査.RuntimeException异常由系统检测,用户的Java程序可不做处理,系统将它们交给缺省的异常处理程序.
6.2异常处理
■6.2.1异常处理的基本结构
■6.2.2多个catch块
■6.2.3finally语句
-1.异常处理的定义
异常处理是用户程序以预定的方式响应运行错误和异常的能力.它的基本方式是:
当一个方法引发一个异常后,可将异常抛出,由该方法的直接或者间接调用者处理异常.
■2.异常处理语句
异常处理语句有tTy、catch,finally>throw和throws.在以下部分将逐一介绍这些语句的作用.
6.2.1异常处理的基本结构
■3.异常处理的基本结构
try-catch结构是异常处理的基本结构.这种结构中可能引发异常的语句封入在try块中,而处理异常的相应语句封入在etch块中.结构的格式如下:
1.try{
2.程序执行体
3・}
4.catch(异常类型1异常对象1){
5.异常处理程序体1
6.}
■3.异常处理的基本结构
7.catch(异常类型2异常对象2){
8・异常处理程序体2
9・}
10
11.«tch(异常类型n异常对tn){
12.异常处理程序体n
B.)
14.finally{
15.异常处理结東M的执行程序体
16.//不论发生什么异常(或者不发生任何异常)•祁雯执行的部分;17J
6.2.1异常处理的基本结构
■说明:
・(l)try语句指明可能产生异常的代码段;
(2)catch语句在try语句之后,用于捕捉异常,一个try语句可以有多个catch语句与之匹配・当有多个catch语句时,系统依照先后顺序逐个检査・用catch语句捕捉异常时,若找不到相匹配的catch语句,将执行缺省的异常处理.
(3)将catch程序块的参数不能设置成多个,一个catch只有一个参数.
■说明:
-(4)若两个catch程序块(均和某个try程序块有关)都用于捕捉同一类型异常,那么将产生语法错误.
(5)若某一类型异常,可能有几个异常处理程序与他相匹配,那么执行first相匹配的异常处理程序
-(6)java中可以使用嵌套^try-catch结构.在使用嵌套的try块时,将先执行内部try块,如果没有遇到匹配的catch块则将检査外部try块的catch块.
6.2.1异常处理的基本结构
■throw语句
用于指出当前现有异常,当程序执行到throw语句时,流程就转到相匹配的异常处理语句,所在的方法也不再返回值.throw语句可以将异常对象提交给调用者,以进行再次处理.
■throws语句
指明方法中可能要产生的异常类型,由调用者进行异常处理・
■【实例6T】
1.publicclassDividerByZcro(
2.publicstaticvoidaaia(Stringargt[]){
3.doublenuo-1;
4・try{
5.nm-1/0;
6.}
7.catch(ArithseticExceptione){
8・Systen・out・print(・Anarithaeticexception
occurred!
1');
9.)
10.}
11J
621异常处理的基本结构
■【实例6-1】
■运行结果为:
Anarithmeticexceptionoccurred!
■说明:
-在本实例中,try语句块中语句num-1/0被执行时,由于被除数为0,因此产生ArithmeticException异常,catch语句捕获到这类异常后,输出aAnarithmeticexceptionoccurred!
6.2.2多个catch块
■单个try块能有许多catch块,当try块有可以引起不同类型异常的语句时,多个c航ch块是必须的。
■【实例6・2】
1.publicclassTryCatch(
2.publicstaticvoidnaio(StringargsQ){
3.inta[]-(0.0);
4.intnu®-l.resuIt-0;
5.try<
6.result■nua/0;
Systea.out.priotlnCnua/a[2]);
«.)
catch(ArithseticBxceplione){
11・)
12.catch
13.
13.)
14.catch
16.
17.)1SJ
19.}
Syste*.out.prinlln(tBrror■■•・e);(Arr&ylndexOutOfBoundsExceptione)(
Systea.out.println(9Error■-•♦e);(Exceptione){
System,out.printIn(fSo»cothererror:
■【实例6-2】■运行结果:
Error-^java・1ang・ArithmelicExcepiion:
/byzero
■说明:
在本实例中,
(1)执行语句result-nu./0;出現被*除异常,此时执行catch(ArithmeticExceptione)块中的语句.此时语句System,out.println(num/a[2]);没有执行到.
(2)如果将W8U11■nun/0;注释掉,那么当执行语句uSyste«.out.println(nua/a[2]);*时会出现數组下标越界异
常ArrayIndexOutOfBoundsException,因此此时运行结果为:
Error°-java・lang・ArrayIndexOutOfBoundsException:
2
(3)若出现其他Exception异常,则由catch(Exceptione)捕获,显示"Soneothererror:
6.2.3finally语句
■finally语句可以和try语句一起使用,无论是否出现异常,finally语句指明的代码一定被执行.一个异常处理程序只有一个finally块,但并不强制必须要有finally块.
■有时,必需处理某些语句(如文件关闭操作),不管异常是否发生,都必须执行.此时,虽然能够在try和catch块放置代码以结束文件,但是为了避免重写代码,可以把代码放在finally块.
■有时候我们希望某些语句在发生异常时也能执行,以释放外部资源或者关闭一个文件,这时可以用finally语句来实现.
■【实例6弋】
1.ioiportjtva
2.ioiportjava.io.・;
J.class・ithoutFioallyExaaple(
4.publicvoidfooOthrowsIOException(
5.〃在空阿的缁口上创建一个套接字
6.ServerSocketst-newServerSocket(0);
7.try{
8.Socketsocket■ss.accept0;
9.〃比处的其他代码•••
10.)
11.catch(IOExceptione)(
12.ss.closeO;//labell
13.tbrove;
K)
15.〃…
16.ss.closeO;//HbcU
17.)
11}
■【实例6-3】
■问题
上述代玛没有finally块,程序中创建了一个套接字,并调用accept方法.在退出该方法之前,必须关闭此套接字.以谜免资源爲洞・为此,在〃label2处调用close来关阖此套接字,此语句为该方法的最后一条语句.正常情况下,〃label2处的close会执行,但是,如果try块中发生一个异常会时,//label2处的close语句是不会执行的,即在这种情况下.套接字没有关闭.可能产生资源満涧・因此.程序中必象捕获这个异常,并在重新发出这个异常之前在//label1处揭入对close的另一个调用.这样就可以确保在退出该方法之前关闭套接字.但上述编写代码方式託麻烦又易于出错,但在没有finally的情况下这長必不可少的.以下借助finally块来解决这个问題.
■【实例6-4】
iaportjava.net.•;importjava.io.•;classlithFinally
(
publicvoidfoo20throwsIOException
(
〃在空的的端口上创建一个套接字
ServerSocketis-newServerSocket(0);try<
Socketsocket■accept0;〃此处的其他代码・••
}finally{
"・cloieO;
}
6.3两种抛出异常的方式
■6.3.1throw—直接抛岀
■6.3.2throws—间接抛岀异常(声明异常)
6.3.1throw—直接抛出
■直接抛出异常
是在方法中用关縫字throw引发明确的异常.当thww被执行时,其后语句将不再被执行,执行流程将直接寻找catch语句并进行匹配throwe.显然,这种异常不是出错产生,而是人为地抛出.
■throw抛出异常的格式为:
throwThrowableObject;
■例如:
thrownewArithmeticException0;
■【实例6-5】
1.classJavaThrow1{
2.publicstaticvoidnain(Stringargs[]){
3・Systea.out.print(");
4・try(
5.Systen.out.print(■);
6.thrownewNulIPointerException0;〃直接拋出一个异常;
7.//System,out.print(*This・illnotexecute!
");〃此句木被执行
8・)
9.catch(NullPointcrExccption■)(
10.Systen.out.print("the*);
11.}
12.Systes.out.print(*ti«e.\nw);
11)
14.}
■运行结果为:
Nowisthetime.
■说明:
-在本实例中,"thrownew
NullPointerExceptionO;”用于人为抛出异常
NullPointerException>catch
(NullPointerExceptionm)块对这类异常进行处理・
■注意:
-语句System,out.print(“Thiswi11notexecute!
”);必须注胖起来,否则编译时会出现如下错误.
E:
>o«wBoak8>Java\M>rk>jAvacJavaThrowi.Java
u・reachablettatemnc
SysteR.out.princCHhiswillnotexecute?
M>;//此包
6.3.2throws—间接抛出异常
■说明:
如果一个方法可能导致一个异常但不处理它,此时要求在方法声明中包含thrxs子句通知潜在调用者.在发生异常时沿着调用层次向上传递.由调用它的方法来处理这些异常.这类异常成为声明异常.
■基本格式为:
类型方法名(參量表)throws异常列表
代玛
■【实例6-10】
classThrovsBxceptioaExaoplel{
privatestaticvoidp0throwiArithaeticException{
〃问按抛出异常,自己并未处理,让方法的直接调用者来处理inti;
i-4/O;〃此句可能引发异常,可是自己并未处理
)
publicstaticvoidnain(Stringargs[]){try{
P0;〃方法的直接调用者俘获处理异常
)
catch(ArithacticExccptione){
Systen.out.println(-Error:
Divideriszero!
■运行结果为:
Error:
Divideriszero!
■说明:
-在本实例中,语句"4/0;将产生异常,产生异常后方法P0并不作处理,而是由调用P0的方法main做处理.
6.4自定义异常
■通过继承Exception类或它的子类,实现自定义异常类.
■对于自定义异常,必须采用throw语句抛出异常,这种类型的异常不会自行产生.
■可以通过扩展Exception类来创建异常类.
■用户定义的异常同样要用try-catch捕获,但必须由用户抛出thrownewMyException.
■【实例6-11]
1・//myException.java
2・classnyExceptionextendsException
3.{}
4.classUserTrial{
5.intnual9num2;
6.publicUserTrial(inta,intb)
7.{nuaHa;nua2°b;)
8・voidshowOthrowsnyException{
9.if((nuoKO)11(nua2>0))
10.thrownewnyException0;
ILSystem.out.println(fValuel-f*numl);
12.System,out.println(fValue2・・ru«2);11}
14J
■【实例6-11]
15.classmyExceptionThrow{
16.publicstaticvoidmain(Stringargs[]){
17.UserTrialtrial-newUserTrial(-1,1);
18.try
19.{trial.showO;}
20.catch(myExceptione)
2L{System,out.printIn(hIllegalValues:
Caughtinmain11);}
22.}
■代码说明:
(1)在上述给出的代码里,称ByException类从Exception类扩展而来.
(2)UserTrial类有一个能引发称为ByException的自定义异常的方法.
(3)在ayExceptionThrow类里的mainO方法创建UserTrial类的对象并传送错误值给构進方法.
(4)nain()方法的try块调用showO方法.
(5)showO方法引发异常,由异常处理程序在i«din()方法里捕荻.
(6)显示在catch块里的消息,"IllegalValues:
Caughtinmain*(非法的值:
在nain中俘获),被显示在屏幕上.
■[实例6-11】
■运行结果为:
IllegalValues:
Caughtinmain
■说明:
由于执行创建对象语句UserTrialtrial=newUserTrial(-1,l);numl与num2的值满足异常触发条件.若将此创建对象语句变为创建UserTrialtrial-newUserTrial(1,T);此时numl与num2的值不满足异常触发条件,异常未触发,运行结果为:
Numl-1
Num2*-1
6.5常见异常
■RuntimcExceptionJava,lang包中多数异常的基类
■ArithmeticException算术错误,如除以0
■11legalArgumentException方法收到非法参数
■ArrayIndexOutOfBoundsExccption数组下标出界
■NullPointerException试图访问null对象引用
■SecurityException试图违反安全性
■ClassNotFoundException不能加载请求的类
6.5常见异常
■NumberFormatException从字符串到数字格式的非法转换
■AWTExceptionAWT中的异常
■IOExccptionI/O异常的根类
■FileNotFoundExccption不能找到文件
■EOFException文件结束
■IllegalAcccssException对类的访问被拒绝
■NoSuchMcthodException请求的方法不存在
■InterruptedException线程中断
■NulIPointerException异常