高级程序设计语言(Java版)8-异常处理_第1页
高级程序设计语言(Java版)8-异常处理_第2页
高级程序设计语言(Java版)8-异常处理_第3页
高级程序设计语言(Java版)8-异常处理_第4页
高级程序设计语言(Java版)8-异常处理_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、8.1 异常处理概述8.2 异常处理机制8.3 异常类8.4 综合实例8.5 习题8.1.1 异常处理的概念 异常是指在某些情况下,会使当前正在执行的方法或代码块无法继续进行的问题。 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。例如,代码中如果少了一个分号,那么运行出来结果是提示是错误java.lang.Error;而如果代码为System.out.println(8/0),用0做了除数,那么会会抛出java.lang.ArithmeticException的异常。【实例8-1】Exception.java public class Exception pu

2、blic static void main(String args) int denominator = 0; if (denominator != 0) int numerator = 8 / denominator; else System.out.println(除数为零); System.out.println(numerator); 运行结果:程序说明: 在这个实例中,不考虑异常的作用,因此为了避免除数为零,最好的做法就是进行一次判断if (denominator != 0),当除数不为零的时候才进入循环做除法,否则直接打印输出结果,这个时候被除数还没有声明,因此程序会出错,抛出ja

3、va.lang.Error的异常。【实例8-2】Exception.java public class Exception public static void main(String args) int denominator = 0; int numerator = 8 / denominator; System.out.println(numerator); 运行结果:8.1.2 使用异常处理的原因程序执行时经常会出现用户输入出错、所需文件找不到、运行时磁盘空间不够、内存耗尽无法进行类的实例化、算术运算错、数组下标越界、JVM崩溃等运行错误,影响程序的正常执行。错误及异常是不可避免的,一

4、个好的应用程序,在满足用户要求的各种功能的同时,还应具备能预见程序执行过程中可能产生的各种异常的能力,并能为异常情况给予恰当处理。Java语言通过面向对象的异常处理机制来解决运行期间的错误,可以预防错误的程序代码或系统错误所造成的不可预期的结果发生。8.1.3 方法的调用堆栈 Java虚拟机用方法调用堆栈来跟踪每个线程中一系列的方法调用过程。每个线程都有一个独立的方法调用堆栈,堆栈底部的是程序的入口方法main(),放一个新的方法被调用时,java虚拟机就会把描述该方法的堆栈结构置入栈顶,位于栈顶的方法是正在执行的方法。Java对异常的处理主要涉及两方面的内容:一是抛出(throw)异常 如果

5、程序在运行过程中出现了运行错误,并且产生的异常与系统中预定义某个异常类相对应,系统就自动产生一个该异常类的对象,这个过程称为抛出(throw)异常。二是捕捉(catch)异常 当有异常对象抛出时,将在程序中寻找处理这个异常的代码,如果找到处理代码,则把异常对象交给该段代码进行处理,这个过程称为捕捉(catch)异常。8.2.1 捕获异常 我们经常会遇见这样的情景:程序中出现了异常但是没有相应的处理措施。这时候java语言就会自动捕获并处理异常,一般来说表现为报告异常字符串,并且在异常发生出结束程序的运行。但是,为了更好的保证程序正常运行,需要人为的捕获并处理异常。在java语言中该机制的使用是

6、try-catch-finally结构。try-catch-finally结构的一般格式如下:try 可能抛出异常的语句 catch ( Exception1 e) 异常处理代码 catch ( Exception2 e) 异常处理代码 finally 必需执行的代码 如果在程序中有效的设计了try-catch-finally结构,会出现两种情况:能够捕获到异常和不能捕获到异常。如果没有捕获到异常时,程序会跳过catch直接到finally(如图8-3 没有捕获到异常时)如果捕获到某个异常,则进入相应的catch块内(如图8-4 捕获到某个异常时)try 语句 1; 语句 2;catch (

7、Exception1 e) catch ( Exception2 e) finally 语句;try 语句 1; 语句 2;catch ( Exception1 e) catch ( Exception2 e) finally 语句;图8-3 没有捕获到异常时 图8-4 捕获到某个异常时8.2.2 声明异常 try-catch-finally是在产生异常的方法内部处理异常。除此之外,还可以通过调用产生异常的方法来处理这些异常。在方法的声明中使用throws语句,其一般格式如下: 方法名(参数) throws 方法体;【实例8-5】ThrowsException.javapublic class

8、 ThrowsException static void test(int a) throws ArithmeticException,ArrayIndexOutOfBoundsException System.out.println(In Situation + a);if (a = 0) System.out.println(no Exception caught);return; else if (a = 1) int iArray = new int4;iArray10 = 3;public static void main(String args) /try-catch-finall

9、y结构try test(0);test(1); catch (ArrayIndexOutOfBoundsException e) System.out.println(Catch + e); finally System.out.println(in Proc finally);运行结果:In Situation0no Exception caughtIn Situation1Catch java.lang.ArrayIndexOutOfBoundsException: 10in Proc finally8.2.3 抛出异常 日常生活中,例如学校中有什么问题都会先去问老师,但是有一些问题例如转

10、学是不能由老师来解决的,这时候老师就需要再去问校长,由校长来解决这个问题。可能校长还有不能解决的问题,就需要去问教育部。抛出异常也是这样的,当一个程序段发生异常时,如果自己不能够进行异常处理,就可以将抛出异常给上一层。如果上一层也不能解决就可以一直向上抛出异常,直到抛出给main方法。如果仍然不能解决,就会中断程序,将异常显示出来。 在java语言中,所有方法都是通过throw语句来抛出一个异常事件,抛出异常首先需要通过throw语句生成一个异常类的对象,其一般格式如下: throw new 异常类名; 注意:异常类名必须是Exception或其直接或间接子类。利用throw语句,可以自定义异

11、常,并显示自定义的异常信息。【实例8-6】ThrowException.javaclass ThrowException public static void main(String args) try throwTest(); catch (NullPointerException e) System.out.println(Recaught: + e);static void throwTest() try throw new NullPointerException(test); catch (NullPointerException e) System.out.println(Caug

12、ht inside throwTest.);throw e;运行结果:Caught inside throwTest.Recaught:java.lang.NullPointerException: test8.2.4 自定义异常尽管java内建的异常处理机制提供了丰富的异常类型,能够满足程序员的大部分需求,但有时候也需要程序员在程序中自定义异常类,根据自己的意愿来处理异常。自定义异常的一般格式为:class 异常类名 extends Exception 方法体;8.3.1 java中异常类的结构 在java语言中,异常有两种分类:1)java.lang.Throwable类为所有对象的父类,

13、可以使用异常处理机制将这些对象抛出并捕获。2)在Throwable类中定义方法来检索与异常相关的错误信息,并打印显示异常发生的栈跟踪信息。它有Error和Exception两个基本子类:错误(Error):JVM系统内部错误、资源耗尽等严重情况;异常(Exception):其它因编程错误或偶然的外在因素导致的一般性问题。Throwable类Error类Exception类 RuntimeException类ArithmeticException类IndexOutofBoundException类ArrayIndexOutofBoundsException类IoException类FileNot

14、FoundException类EOFException类在Java.lang包在Java.io包图8-5 java中异常类的结构8.3.2 运行时异常运行时异常(RuntimeException)是指因设计或实现方式不当导致的问题。也可以说是程序员的原因导致的问题,本来可以避免发生的情况。这种异常的特点是java编译器不会检查它。由于没有处理它,因此,当出现这类异常时,异常对象一直被传递到main()方法,程序将异常终止。如果采用了异常处理,异常将会被相应的程序执行处理。表8-1给出了java语言预定义的Error异常子类,下面是运行时异常的常见子类,如表8-2 运行时异常子类:异常类名异常类

15、名描述描述ArithmeticException算数错误NullPointerException非法使用空引用ArrayIndexOutOfBoundsException数组下标越界ClassCastException非法强制转换类型NegativeArraySizeException创建带负维数大小的数组的尝试ArrayStoreException数组元素赋值类型不兼容IndexOutOfBoundException某些类型索引越界NumberFormatException字符串到数字格式非法转换SecurityException试图违反安全性StringIndexOutOfBounds试图

16、在字符串边界之外索引UnsupportedOperationException遇到不支持的操作IllegalArgumentException调用方法的参数非法IllegalMonitorStateException非法监控操作IllegalStateException环境或应用状态不正确IllegalThreadStateException请求操作与当前线程状态不兼容表8-2 运行时异常子类8.3.3 受检查异常 Exception类中除了RuntimeException子类以外的类都是受检查异常类。如表8-3 受检查异常子类:异常类名异常类名描述描述ClassNotFoundExcepti

17、on找不到类CloneNotSupportedException试图复制一个不能实现的Cloneable接口对象NoSuchMethodException请求的字段不存在NoSuchMethodException请求的方法不存在InterruptedException一个线程被另一个线程中断IllAccessException对一个类的访问被拒绝InstantiationException试图创建一个抽象类或者抽象接口的对象【实例8-9】ExceptionTest.javaclass ExceptionCom extends Exception private static final lon

18、g serialVersionUID = 1L;ExceptionCom() super(自定义异常);public class ExceptionTest public void A1(int n) System.out.println(A1前面);A2(n);System.out.println(A1后面);public void A2(int n) System.out.println(A2前面);try System.out.println(try的前面);A3(n);/ 发生异常时不会输出System.out.println(try的后面); catch (ExceptionCom e) System.err.println(e.getMessage(); finally System.out.println(无论是否发生异常);System.out.println(A2后面);publi

温馨提示

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

评论

0/150

提交评论