java语言基础教程(张化祥):第七章异常处理_第1页
java语言基础教程(张化祥):第七章异常处理_第2页
java语言基础教程(张化祥):第七章异常处理_第3页
java语言基础教程(张化祥):第七章异常处理_第4页
java语言基础教程(张化祥):第七章异常处理_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第 7章 异常处理异常基础异常是指程序在运行时发生的错误。通过异常处理机制,我们可以用一种结构化的可控方式来处理运行时地错误。尽管大多数高级程序设计语言都提供了一些异常处理机制,但是 Java中的异常处理机制比其它语言提供的更简洁、更灵活。在 Java中,所有的异常都用类来表示。所有的异常类都是从java.lang包中的 Throwable类继承而来的。 Error和 Exception 1.ErrorError用来表示编译和运行错误,如程序进入了死循环、内存溢出等。Error只能在编译阶段解决,运行时程序本身无法解决,只能依靠其它程序的干预,否则会一直处于非正常状态。 Error处理一般由系统承担, Java本身不提供相应的 Error处理机制。2.ExceptionException用来表示由程序活动所导致的错误,如运算时除数为 0、打开一个文件时发现文件不存在等。当程序运行出现 Exception时,在程序中加入异常处理代码,仍可使程序继续运行直至程序结束。 异常处理机制正是针对 Exception类的Throwable的方法 Throwable中定义了多个方法。因为所有的异常类都是 Throwable的子类,所以它们都继承了 Throwable的这些方法 。Throwable fillInStackTrace():返回一个包含调用栈信息的 Throwable对象,该对象可以被重新抛出。void printStackTrace():将调用栈信息输出到标准错误 。String geiMessage():返回对异常的描述。String getLocalizedMessage():返回对异常的本地描述。String toString():返回一个包含异常描述的 String对象。异常的产生 Java中的异常处理机制看似十分的繁琐,实际使用时却并不复杂。下面介绍一个简单的基本异常:class Throw1public static void main(String args) int a=new int4;System.out.println(“Before exception!“);a8=12; /产生一个数组下标越界异常System.out.println(“After exception!“);输出结果:Followed by exception!Exception in thread “main“ java.lang.ArrayIndexOutOfBoundsException: 8at Throw1.main(Throw1.java:5)上例中产生了一个数组下标越界异常,它是 RuntimeException的一个子类,它是 Java中的一个基本异常,要想对各种异常类有个全面的了解,需要去查看 Java的 JDK Documentation。我们可以看到,异常产生之后程序终止了执行,并且输出了相应的异常信息。此例中产生的异常有 Java虚拟机自动抛出。捕获和处理异常 程序发生异常时,会生成一个异常对象,这个异常对象会在方法内部被抛出,它假设异常将被异常处理程序捕获。如果程序不捕获异常,它就要被JVM捕获,这个方法将在抛出异常的过程中结束。要是不希望方法就此结束,可以在方法内部设置一个特殊的块来监视可能产生异常的代码,然后让程序来捕获并处理异常对象从而不会影响其他语句的执行。在 Java中,提供了try和 catch语句来捕获和处理一个或多个异常。语法格式如下:try / 可能产生异常的代码catch(Type1 e) / 对异常类型 Type1的异常处理代码. 其中, try块是一段可能产生异常的代码,也被叫做 “监控区域 ”; catch语句的参数类似于方法的声明,包括一个异常类型和一个异常对象。异常类型必须为 Throwable类的子类,它指明了 catch语句所处理的异常类型,异常对象则在 try块中产生;大括号中是异常处理程序,其中可以调用对象的方法。与一个 try相关的 catch语句可以有一个或多个,异常的类型决定了要执行哪个 catch语句。也就是说,如果由一个 catch语句指定的异常类型与发生的异常类型相符,那么就会执行这个 catch语句,其他的 catch语句则被跳过。例如:class Try1public static void main(String args)int a=new int4;try System.out.println(“Before exception!“);a8=12; System.out.println(“After exception“);catch(ArrayIndexOutOfBoundsException e)System.out.println(“ArrayIndexOutOfBoundsException caught!“);catch(ArithmeticException e)System.out.println(“ArithmeticException caught!“);System.out.println(“End up!“);输出结果:Before exception! ArrayIndexOutOfBoundsException caught!End up!运行结果中可以看出,上例 try块中产生了一个数组下标越界异常,这个异常对象被第一个 catch语句捕获并处理,第二个 catch语句则被直接跳过,紧接着执行了 catch语句后面的输出语句。如果 try块中没有抛出异常,那么 try块就会全部执行结束,并且会跳过它的所有 catch语句,从最后一个 catch后面的第一个语句继续执行。例如:class Try2public static void main(String args)int a=new int4;trya0=12;System.out.println(“No!“); catch(ArrayIndexOutOfBoundsException e)System.out.println(“ArrayIndexOutOfBoundsException caught!“);System.out.println(“End up!“);输出结果:Will exception be generated?No!End up!try代码块中可能会抛出一个或多个异常。我们要针对每个可能发生的异常,准备相应的异常处理程序。例如:class Try3public static void main(String args)int a=6,7,16,25,43,48,55,76;int b=3,0,4,5,0,8;for(int i=0;ia.length;i+)trySystem.out.println(ai+“/“+bi+“is“+ai/bi);catch(ArithmeticException e)System.out.println(“Cant divide by zero!“);catch(ArrayIndexOutOfBoundsException e)System.out.println(“No matching element found!“);输出结果: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!捕获所有异常 当抛出异常的时候, Java会从上向下分别对每个 catch语句处理的异常类型进行检测,然后按照代码的书写顺序找出 “最近 ”的处理程序。找到匹配的处理程序之后,它便认为异常将得到处理,然后就不在继续查找。查找的时候并不要求抛出的异常同处理程序所声名的异常完全匹配。派生类的对象也可以匹配其基类的处理程序。例如:class Try4public static void main(String args)int a=6,7,16,25,43,48,55,76;int b=3,0,4,5,0,8;for(int i=0;ia.length;i+)trySystem.out.println(ai+“/“+bi+“is“+ai/bi);catch(ArrayIndexOutOfBoundsException e)System.out.println(“No natching element found! “);catch(RuntimeException e)System.out.println(“Some exception generated! “);输出结果:6/3 is 2Some exception generated!16/4 is 425/5 is 5Some exception generated!48/8 is 6No natching element found!No natching element found!从运行结果中我们可以看到,数组下标越界异常被第一个 catch语句捕获并处理,而算术异常却被 RuntimeException类型的 catch语句所捕获,这是因为 ArithmeticException是 RuntimeException的子类。因此,如果你既想捕获超类异常,又想捕获子类异常,那么就应该把子类的 catch语句放在catch语句序列的前面。很显然,我们也可以用一个 catch语句处理多个异常类型,这时它的异常类型参数应该是这些异常类型的超类。在实际情况下,我们通常不能完全确定抛出异常的类型,为了保证程序的顺利运行,我们需要捕获所有可能类型的异常。通过捕获异常类型的基类 Exception就可以做到这一点:catch (Exception e) /抛出异常 我们可以通过 throw语句手动抛出异常。其基本语法格式如下:throw Obj;其中 throw是关键字, Obj是创建的异常类型的对象。在 throw语句中同样是使用 new创建异常类型的对象。例如:class Throw2public static void main(String args)trySystem.out.println(“Before throw!“);throw new ArithmeticException();catch(ArithmeticException e)System.out.println(“ArithmeticException caught!“);System.out.println(“End up!“);输出结果:Before throw!ArithmeticException caught!End up!重新抛出异常由 catch语句捕获的异常可以重新抛出以使外部 catch语句可以捕获它。重新抛出的主要原因是为了允许多个异常处理程序访问异常。重抛异常会把异常抛给上一级环境中的异常处理程序,高一级环境中捕获此异常的处理程序可以从这个异常对象中得到所有信息。class UseRethrowpublic static void t()trySystem.out.println(“Bofore exception!“);throw new ArithmeticException(); catch(ArithmeticException e)System.out.println(“ArithmeticException caught!“);throw e;class RethrowDemopublic static void main(String args)tryUseRethrow.t();catch(ArithmeticException e)System.out.println(“Caught again!“);输出结果:Before exception!ArithmeticException caught!Caught again!ArrayIndexOutOfBoundsException在方法 t()中被重新抛出,又在 main()中被再次捕获。finally 对于一些代码,可能会希望无论 try块中的异常是否被抛出,它们都能得到执行。为了在退出 try/catch代码块时指定一个要执行的代码块,可以在异常处理程序后面加上 finally子句。包含 finally的 try/catch的基本形式如下所示:try / 可能产生异常的代码catch( Type1 e) / 对异常类型 Type1的异常处理代码Finally/ 退出 try/catch代码块后要执行的代码 class Usefinally2public static void t()int a=new int4;trySystem.out.println(“Before exception!“);a8=10; catch(ArrayIndexOutOfBoundsException e)System.out.println(“ArrayIndexOutOfBoundsException caught!“);throw e;finallySystem.out.println(“In finally clause!“);class FinallyDemo2public static void main(String args)tryUsefinally2.t();catch(ArrayIndexOutOfBoundsException e)System.out.println(“Caught again!“);输出结果:Before exception!ArrayIndexOutOfBoundsException caught!In finally clause!Caught again!上例中内层 try块抛出了异常, finally块中的语句得到了执行。再将程序修改一下。将程序中的这一行 “a8=10;”改为 “a1=10;”,此时没有异常抛出,运行结果如下:Before exception!In finally clause!可见无论是出于何种原因,只要离开 try/catch代码块,就会执行 finally代码块。异常说明在某些情况下,如果一个方法产生自己不处理的异常,它就必须在throws子句中声名该异常,这就是异常说明,它属于方法声名的一部分,紧跟在形式参数列表之后。包含 throws子句的方法的基本形式如下:returnType methodname(/*argument list*/) throwsexceptionList/method body此处, exceptionList是一个方法可能会抛出的异常的列表,各个异常之间用逗号隔开。凡是 RuntimeException及其子类的异常都不必在列表中指定。它们被称为 “未被检查的异常 ”。其它类型异常的处理都是由编译器强制实施的。这种异常被称为 “被检查的异常 ”。 class ThrowsDemopublic static void t() throws ExceptionS

温馨提示

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

最新文档

评论

0/150

提交评论