第6章-异常与异常处理_第1页
第6章-异常与异常处理_第2页
第6章-异常与异常处理_第3页
第6章-异常与异常处理_第4页
第6章-异常与异常处理_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、- -第6章异常和异常处理Java语言作为面向对象的程序设计语言,和其他早期程序设计语言一样,在编写过程中会出现除语法之外的其他错误。在Java中引进了异常和异常类来进展错误处理。本章将介绍异常的概念及其异常处理的方法。核心内容:1. 异常的定义及常见异常类的层次构造2. 异常处理机制3. 自定义异常的方法6.1 异常处理例如异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开场,你也许已经知道如何用if.else.来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做一样处理,感觉相当的麻烦!下面通过一个简单的例子,初步了

2、解就ava中的异常。【例6-1】运行以下程序,从输出结果中分析出现何种异常。1 class Excep2public int division(int a,int b)34return a/b;56 7 class Example6_18 public static void main(String args)9Excep excep=new Excep();10excep.division(5,0);1112 程序运行结果:D:java6javac Example6_1.javaD:java6java Example6_1Exception in thread main java.lang.

3、ArithmeticException: / by zero at Excep.division(ExcepTest.java:3) at ExcepTest.main(ExcepTest.java:8)程序分析:从程序的输出结果中说明:在main函数中出现了异常错误,但无法预知在哪里出现了异常。6.2 异常概述任何一个软件程序在运行初期都会产生错误, Java程序也不例外。例如,内存空间缺乏,程序控制试图翻开一个不存在的文件,网络连接数据中断,数组下标越界等等。这些错误的出现如果没有及时检查出来并解决,就会阻止程序的正常执行。在Java中,通常将运行时期产生的错误分为两类:一类是致命错误,它

4、指的是一个合理的应用程序不能截获的严重的问题,大多数都是反常的情况。例如:内存溢出;一般的开发人员是无法处理这些错误的;另一类是非致命错误,也称为异常。它指的是一个程序在运行时出现的错误,通过JVM(Java虚拟机)通知已经犯了一个错误,需要修改它。例如:数组越界。异常又称为例外,它是某种异常类的对象。Java中定义了许多异常类,每个异常类代表一种异常事件。Java中异常通常是程序执行时出现的不正常的情况,我们可以通过定义异常对象,在出现异常时进展捕获,然后进展处理,来使程序正常的运行。异常捕获是通过一个变量去指向出错的对象,然后对这个变量进展处理。6.2.1 异常和异常类异常exceptio

5、n是Java程序在运行期,即经过javac编译程序后,Java运行程序时所发生的会中断程序正常执行的错误。对待异常,不是简单地完毕程序,而是通过异常传达的重要信息转去执行某段特殊的代码来处理这个异常,并设法恢复程序的正常执行。Java语言中定义了许多异常类,是处理运行时错误的特殊类,每个异常类代表一种异常事件。该类中通常包含产生某种异常的信息和处理异常的方法等内容 。当程序在运行中发生了可以识别的异常时,系统便产生一个相应的异常类的对象,简称异常。系统中一旦产生了异常,便去寻找处理该种异常的处理程序,以保证不产生死机,从而保证程序的平安运行,这便是异常处理的简单原理。下面通过一个简单的例子示范

6、什么是异常和异常类。 例6-2 数组越界异常例如。1 public class Example6_22public static void main(String args)3 int a=1,2; /定义数组4 for(int i=0;ijavac Example6_2.javaD:java6java Example6_212Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 2 at Example6_1.main(Example6_1.java:6)程序分析:1该程序定义了数组长度为2的数组a;2执行for

7、循环时,当i的值自增到2时,访问的是a2,超出了数组的长度;3程序的输出结果:ArrayIndexOutOfBoundsException是数组下标越界异常类,它代表数组下标越界事件。在没有对异常进展任何处理的情况下,程序执行到这段包含错误信息的代码时就会自动中断。引进异常处理机制就会为程序的退出提供平安的通道。后面的章节会详细介绍异常处理机制的使用方法。6.2.2 异常类的类层次构造异常的继承构造:基类为Throwable,Error和Exception继承Throwable。其中,Error类描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象一般是由虚拟

8、机抛出。如果出现这种错误,除了尽力使程序平安退出外,在其他方面是无能为力的。所以,在进展程序设计时,应该更关注Exception类。Exception类又派生了许多子类,分为两局部,RuntimeException类和非RuntimeException类。RuntimeException类表示编程时所存在的隐患或错误在运行期间由java虚拟机所产生的异常,包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原那么是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来防止数组越界访问异常。其他非Runt

9、imeException类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。Exception类供应用程序使用。异常类及其子类的构造如图6-1所示。图6-1 异常类的类层次构造图常见的系统定义异常如下:l ArithmeticException:数学错误。l ArrayIndexOutOfBoundsException:数组下标越界使用。l ClassNotFoundException:未找到欲使用的类。l FileNotFoundException:未找到指定的文件或目录。l InterruptedException:线程在睡眠、等待或

10、其他原因暂停时被其他线程打断。l IOException:输入、输出错误。l MalformedURLException:URL格式错误。l NullPointerException:引用空的无内存空间的对象。l SecurityException:平安性错误,如Applet读写文件。l UnknownHostException:无法确定主机的IP地址。6.2.3 异常类的方法1异常类的常用构造方法 Exception:构造详细信息为空的新异常; ExceptionString message:构造带指定详细信息的新异常; 2异常类的常用方法public String getMessage:该

11、方法返回描述异常对象信息的详细消息字符串;public void printStackTrace:该方法在屏幕上输出异常对象及其跟踪的堆栈; 【例6-3】这是一个产生NullPointerException异常的程序,getMessage()和printStackTrace()方法演示。1 public class Example6_32public static void main(String args)3try4crunch(null);5catch(Exception e)67System.out.println(e.getMessage();8e.printStackTrace();

12、91011static void crunch(int a)12mash(a);1314static void mash(int b) 15System.out.println(b0);1617 程序运行结果:D:java6javac Example6_3.javaD:java6java Example6_3nulljava.lang.NullPointerException at Example6_3.mash(Example6_3.java:14) at Example6_3.crunch(Example6_3.java:11) at Example6_3.main(Example6_3.

13、java:4)6.2.4 异常处理带来的好处 Java的异常处理机制给用户提供了友好的界面,当异常发生时给用户一个提示,而不会直接报出错误,而且这些错误是一堆Java代码,用户根本就不懂。 java异常处理可提高程序的强健性,可以在catch和finally代码中给程序一个修正的时机,使得程序不因异常而终止。同时,通过获取java异常信息,为程序的开发维护提供了方便,一般通过异常信息就能很快找到出现异常的问题代码所在。 异常处理还有一个非常重要的好处,就是让错误处理代码显得更有条理。错误产生时不需要调用方法做检查,由异常处理捕获,集中到异常处理程序代码段处理。这种方法把“讲述要做什么的代码同“

14、出错的时候该执行的代码分开来了。6.3 异常处理机制 Java异常可看作是一类消息,它传送一些系统问题,故障及未按规定执行的动作的相关信息。Java语言为何要处理异常?有时候我们需要在系统中交流错误信息,以便按照统一的方式处理问题,有时是因为有假设干处理问题的可能方式,但不知道使用哪一种,此时,可将处理异常的任务委托给调用方法的代码。调用者通常更能了解问题来源的上下文,能跟好确实定恢复方式。 如图展示了异常消息架构。异常接收者异常处理代码异常对象参数传递图6-2 异常消息架构图异常产生者,创立异常对象问题!在Java应用程序中,对异常的处理有三种方式:(1) 程序运行时异常通常不做处理,由Ja

15、va虚拟机自动进展处理;(2) 使用try-catch-finally语句捕获异常;(3) 使用throw抛出异常 6.3.1处理异常处理异常机制采用try-catch-finally语句实现。格式如下:try catch()catch().finally1try语句块 在try语句块后边花括号中的程序段,包含一个或者多个语句,这些可能会抛出异常的语句都被放在try语句块中,同时指出了该程序段后面catch方法所捕获的异常的范围。2catch方法 在try语句块后面通常要有一个或多个catch()方法,处理try语句块内抛出的异常事件。即catch方法是try块产生异常的接收者。想要捕获到一个

16、异常就要准备一段异常处理程序。该方法有且仅有一个特定类型的参数:某异常类的对象。如果try语句块抛出了异常,异常处理机制就会自动地对后面出现的catch()方法的参数进展匹配,找到与异常类型匹配的第一个异常处理程序。然后进入到该catch()方法语句块中处理。3finally语句在finally语句块,无论try块代码的结果如何,是否产生异常事件,也无论哪个catch方法被执行,该语句后面的程序段总是被执行。因此,通常使用finally语句的程序代码为该程序提供一个统一的出口。try-catch-finally规那么:1必须在try之后添加catch或finally块。Try块后可同时有cat

17、ch和finally块,但至少有一个块。2当程序中包含多条catch语句时,哪条catch语句会被执行取决于try语句产生的异常事件。只有catch方法参数的异常类型与生成的异常事件类型完全一致或是它的父类时才能被执行。3catch方法检查匹配是顺序进展的,通常catch()方法的排序顺序是从特殊到一般,否那么后面的catch()方法会执行不到。【例6-4】下面是一个使用try-catch-finally语句格式的异常处理程序,分析该程序的运行结果。1 public class Example6_42public static void error()3int a=new int5;4for(

18、int i=0;ijavac Example6_4.javaD:java6java Example6_4java.lang.ArithmeticException: / by zero at Example6_4.error(Example6_4.java:6) at Example6_4.main(Example6_4.java:17)循环次数为i=0循环次数为i=1循环次数为i=2循环次数为i=3循环次数为i=4下标越界处为i=5循环次数为i=5程序分析:当i=0时,发生除数为0异常,try语句抛出异常,catch语句捕获并处理异常,输出第一行结果。处理异常完毕,执行finally语句,将

19、循环次数输出。当i=14时,try语句中没有发生异常,那么执行完try语句直接执行finally语句,输出循环次数。6.3.2 声明异常在6.3.1中,使用异常处理机制try-catch-finally将捕获到所产生的异常事件在当前方法中进展处理,这是一种处理异常的方法。现在介绍另一种处理异常的方法,声明异常。该方法是针对当前方法处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。异常的声明是告诉java编译器有一个异常出现了。在方法中,异常声明在方法的头部,利用关键字“throws来表示此方法在运行的时候,很可能会出现异常现象。声明异常的格式如下:throwsthro

20、ws后面的中指出可能发生且不进展处理的所有异常列表,多个异常之间用逗号分隔。例如:public void test() throws NullPointerException,ArithmeticException;在方法头中声明了异常,同时需要在方法内部通过throw关键字抛出异常对象。一旦方法声明了异常,throws关键字后异常列表中的所有异常要求调用该方法的程序对这些异常进展处理。抛出异常的一般格式如下:throw ;例如:throw new ArithmeticException(); 或ArithmeticException e=new ArithmeticException()th

21、row e;抛出异常只能抛出方法声明中throws关键字后的异常列表中的异常通常情况下,通过throw抛出的异常为用户自己创立的异常类的实例注意:throws与throw的区别。(1) throws 用于声明方法可能会抛出的异常,所以它常用在方法声明的后面。比方:public static void main(String args) throws IOException(2) throw 用于抛出代码层次的异常,常用于方法块里面的代码,常和trycatch语句块搭配使用。【例6-5】使用throw语句抛出异常。1 public class Example6_52public static v

22、oid main(String args)3int a=4,b=0;4try5if(b=0) 6 throw new AtithmeticException(一个算术异常);7else8 System.out.println(a+/+b+=+a/b);9catch(ArithmeticException e)10System.out.println(抛出异常为:+e);111213程序运行结果为:D:java6javac Example6_5.javaD:java6java Example6_5抛出异常为:java.lang.ArithmeticException: 一个算术异常程序说明:(1

23、) 该程序是要计算a/b的值。因b是除数,不能为0。假设b为0,那么系统会抛出ArithmeticException异常,代表除到0这个数。(2) 在try语句块,判断除数b是否为0,从而用throw抛出ArithmeticException异常。并由catch()捕捉到异常。(3) 抛出异常时,throw关键字所抛出的是异常类的实例对象,因此throw语句必须使用new关键字来产生对象。6.4 自定义异常程序中经常会出现一些不可预知的错误,系统已定义了异常类来处理常见错误。但还有很多系统无法识别的错误,为了保证系统的稳定性,需要用户创立自己的异常来解决不可预知的问题。 要想创立自己的异常,必

24、须继承已有的异常类。这个已有的异常类可以是Exception类,Exception类的子类和用户已定义的异常类。 用户自定义异常通常按以下步骤完成。1. 创立异常类创立异常类的格式如下:class extends 类体; 例如:class MyException extends Exception 创立自定义异常的最简单做法就是直接让编译器生成一个默认的构造方法,这样做几乎不需要写任何代码。2. 抛出异常用户自定义的异常,系统是不会自动抛出的,用户必须通过throw语句进展抛出。例如:public void getSalary() throws MyException; MyException

25、 e=new MyException(“Trying to get a salary,but no person was specified!);throw e;在getSalary()方法中抛出了自定义的异常MyException类对象e。3. 捕获抛出来的异常异常抛出后,捕获该异常就可以采用前面学过的try-catch-finally异常处理机制对抛出的异常捕获并进展处理。例如:;public static void main(String args) Person p=new Person();tryp.getSalary(); /调用抛出MyException异常的getSalary(

26、)方法catch(MyException e) /捕获MyException异常类对象e System.out.println(“catch it!);自定义异常的策略是:将可能扔出异常的方法至于try语句监控之下,然后出了事情就在catch()方法中处理这个异常,至于处理的方式可以选择当场处理,如果处理不了就交予其他地方处理。【例6-6】创立自定义异常类举例1 class MyException extends Exception2 public MyException()3 super();45 public MyException(String msg)6 super(msg);7 8

27、9 public class Example6_610 public static void myE() throws MyException11 throw new MyException(“程序异常);1213public static void main(String args)14 try15 Example6_6.myE();16 catch(MyException e)17 System.out.println(e);18 1920程序运行结果:D:java6javac Example6_6.javaD:java6java Example6_6MyException: 程序异常本章

28、小结异常处理把Java程序各种可能出现的错误都看作异常,集中起来统一处理。程序员只需要说明何处可能出现异常,如何处理异常即可。try-catch异常处理机制是指当try块中发生了一个异常,try-catch语句就会自动在catch语句中,找出与该异常类相匹配的参数,就执行包含这一参数的catch语句中的Java代码,执行完catch语句后,程序恢复执行,但不会回到异常发生处继续执行,而是执行finally后面的代码。throws抛出异常和方法说明联系在一起,是针对以下情况:调用的方法抛出了异常、检测到了错误并使用throw语句抛出异常、程序代码有错误从而异常。方法中出现的异常由catch语句捕

29、获,并进展处理。习题一 选择题从每题A、B、C、D四个选项中选择一个符合条件的正确选项1. 以下关于异常处理的描述中,错误的选项是 。A 程序运行时异常由Java虚拟机自动进展处理 B 使用try-catch-finally语句捕获异常 C 捕获到的异常只能在当前方法中处理,不能在其他方法中处理D 使用throw语句抛出异常2. 如果一个程序段中有多个catch,那么程序会按如下哪种情况执行? A.找到适合的异常类型后继续执行后面的catch。B.找到每个符合条件的catch都执行一次。C.找到适合的异常类型后就不再执行后面的catch。D.对每个catch都执行一次。3. 编译并运行以下程序

30、,以下描述哪个选项是正确的? 1 class AtestOftoString()2protected String toString()3return super.toString();45A 编译通过运行无异常B 编译通过但运行时出错C 行2出错,不能成功编译D 行3出错,不能成功编译4. 有如下代码段:1) 2) if(unsafe()/do something3)else if(safe()/do the other4) 其中,方法unsafe() 将抛出IOException, 请问可将以下哪项填入第1行? A、public IOException methodName()B、publ

31、ic void methodName()C、public void methodName() throw IOExceptionD、public void methodName() throws IOException5. 在Java的异常处理语句try-catch-finally中,以下描述正确的选项是: A.try后面是可能产生异常的代码,catch后面是捕获到某种异常对象时进展处理的代码,finally后面是没有捕获到异常时要执行的代码B.try后面是可能产生异常的代码,catch后面是捕获到某种异常对象时进展处理的代码,finally后面是无论是否捕获到异常都必须执行的代码C.catc

32、h语句和finally语句都可以缺省D.catch语句用来处理程序运行时的非致命性错误,而finally语句用来处理程序运行时的致命性错误.6. 关于异常处理,以下说法错误的选项是 。A可以使用throw语句抛出异常B程序可以使用try、catch、finally语句捕获异常C无论try块中是否发生异常,finally标识的代码块都会被执行Dtry语句后只能有一个catch语句7. 如要抛出异常,应用以下哪种子句? A. catch B. throw C. try D. finally8. 对于catch 子句的排列,以下哪种是正确的? A. 父类在先,子类在后 B. 子类在先,父类在后 C. 有继承关系的异常不能在同一个 try 程序段内 D. 先有子类,其他如何排列都无关9.在编写异常处理的Java程序中,每个catch语句块都应该与( )语句块对应,使得用该语句块来启动Java的异常处理机制。 A. if - else B. switch C. try D. throw10.以下常见的系统定义的异常中,哪个是输入、输出异常 A. ClassNotFoundException B. IOException C. FileNotFoundException D. UnknownHostException二 判断题1. ()同一段程序可能产生不止一种异常。可以放置多个ca

温馨提示

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

评论

0/150

提交评论