1、Java面向对象程序设计第4章 Java异常处理教学内容n了解什么是异常n理解异常的分类n掌握异常处理n理解自定义异常异常的引入本章开始学习本章开始学习Java的异常处理机制,在介绍异常处理机制之前,先看下面的一的异常处理机制,在介绍异常处理机制之前,先看下面的一个引例。个引例。【例【例4-1】:异常案例的引入】:异常案例的引入public class Demo4_01 public static void main(String args)String Course=Java程序设计程序设计,JSP程序设计程序设计,A程程序设计序设计,C#程序设计程序设计;for(int i=0;i=4;i
2、+)System.out.println(Coursei);System.out.println(n this is the end);程序运行的结果:程序运行的结果:异常的概念Java异常是Java提供的用于处理程序中错误的一种机制。所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,这个过程称为抛出(throw)
3、异常。当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。异常的分类Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类,Throwable又派生出Error类和Exception类。Error称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。Exception是所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获。Java异常类的类结构图如图4-1所示:程序能处理的Exception异常类的子类,包括IOException和R
4、untimeException异常,RuntimeException称为运行期异常,一类特殊的异常,如被0除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大,因此由系统自动检测并将它们交给缺省的异常处理程序。异常的处理 程序在运行中一旦发生一个错误,系统会自动生成一个异常对象,这个对象封装了和这个异常相关的信息并且会被提交给JAVA运行时系统,这个过程称为抛出异常。当JAVA运行时系统接收到抛出的异常对象时,会寻找能处理这一异常的代码并把该异常对象交给其处理,这一过程称为捕获异常。JAVA的异常处理掌握5个关键字try、catch、final
5、ly、throws、throw的使用。语法格式1,try语句后面跟一个catch语句:try /语句块;/可能产生异常的代码catch(异常类名 对象名)/语句块;/对异常的处理finally /语句块;2、语法格式2,try语句后面跟多个catch语句:try/语句块;.catch(异常类名1 对象名1)/语句块;catch(异常类名2 对象名2)/语句块;catch(异常类名3 对象名3)/语句块 catch.finall /语句块;关于trycatchfinally结构,有以下几点说明:1)try语句块中的语句是可能发生异常的语句,或者说是需要监控的语句。如果执行到该语句块中的某条语句发
6、生异常,则立即停止该语句块的执行,流程会根据发生异常的类型转到相应的catch语句块。2)try语句块后可以有多个catch语句块,每一个catch语句块声明其能处理的异常类型并提供了处理的方法。如果执行try语句块中的语句没有发生异常,显然所有catch语句块也不会被执行。3)“catch(异常类 参数名)”这里的参数用来接收抛出异常对象的引用,通过该引用可以获取与抛出异常相关的信息。所以只有当抛出的异常类型和“catch(异常类 参数名)”中异常类类型相同或者是其子类的时候该catch语句块才会被执行。4)由于异常对象与catch块的匹配是按照catch语句块的先后排列顺序进行的,有多个c
7、atch语句块时,最多只会执行其中一个,所以在处理多异常时应注意各catch语句块的排列顺序,如果处理的异常存在继承关系,应该先处理子类异常后处理父类异常,否则编译不能通过。5)finally代码块无论是否发生异常都会被执行,它为异常处理提供了一个统一的出口,所以在语句块中可以进行资源的清除工作,如关闭打开的文件或删除临时文件等。【例4-2】:通过案例来掌握trycatchfinally的使用import java.util.InputMismatchException;import java.util.Scanner;public class Demo4_02 public static v
8、oid main(String args)try Scanner sc=new Scanner(System.in);System.out.println(输 入第一个数:);int a=sc.nextInt();System.out.println(输入第二个数:);int b=sc.nextInt();System.out.println(两数相除的结果为:+a/b);catch(InputMismatchException e)/输入不匹配异常System.out.println(你应该输入整数);catch(ArithmeticException e)/算术异常System.out.p
9、rintln(除数不能为0);catch(Exception e)/其他异常System.out.println(未知名错误);finally System.out.println(程序运行结束了);程序运行的结果:throws和throw的使用throws是声明该方法可能抛出的异常,如果该方法确实有异常发生,会生成一个异常对象并自动抛出该异常,也可以采用throw显示抛出;如果自行定义异常类对象,然后强制抛出,就要采用throw关键字抛出异常。throws的语法格式:修饰符 方法返回值类型 方法名(参数列表)throws 异常类1,异常类n /方法体用throws声明该方法体可能有异常产生,
10、如果有多个异常类,异常类之间用逗号分隔。throw关键字抛出异常的语法格式如下:throw new 异常类(参数列表);throws和throw关键字经常配合起来使用。【例4-3】:通过案例来掌握throws的使用class Mathspublic int div(int i,int j)throws Exception /定义除法操作,如果有异常,则交给被调用处处理int temp=i/j;/计算,但是此处有可能出现异常return temp;public class Demo4_03 public static void main(String args)throws Exception
11、Maths m=new Maths();/实例化Math类对象 System.out.println(除法操作:+m.div(10,0);程序运行结果:【例4-4】:通过案例来掌握throws和throw的使用public class Demo4_04 public static void printScore(int score)throws Exception if(score100)throw new Exception(输入的成绩有误,必须在0-100之间的整数);else System.out.println(该生的成绩是:+score);public static void mai
12、n(String args)int score=-1;try printScore(score);catch(Exception e)System.out.println(捕获的异常信息为:+e.getMessage();程序运行结果:自定义异常只需要继承Exception类就可以自定义异常类。因为JAVA中提供的都是标准异常类(包括一些异常信息),如果需要自己想要的异常信息就可以自定义异常类。【例4-5】:通过案例来掌握自定义异常类的使用class MyException extends Exception/自定义异常类继承Exception类public MyException(Strin
13、g msg)super(msg);/调用Exception类中有一个参数的构造方法 ;public class Demo4_05 public static void main(String args)trythrow new MyException(自定义异常。);/抛出异常 catch(Exception e)System.out.println(e);/打印错误信息 程序运行结果:任务总结 主要学习了Java的异常处理机制,学习了什么是异常,异常的分类和异常的几种处理方法,以及自定义异常。Java异常是用于处理程序中在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读
14、取的文件不存在)的一种机制。Error称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。RuntimeException称为运行期异常,一类特殊的异常。JAVA的异常处理掌握5个关键字try、catch、finally、throws、throw的使用。throws声明该方法可能抛出的异常,throw是抛出异常。任务练习1.同一段程序可能产生不止一种异常。可以放置多个_子句,其中每一种异常类型都将被检查,第一个与之匹配的就会被执行。2.捕获异常要求在程序的方法中预先声明,在调用方法时用try-catch-_语句捕获并处理。3.java语言认为那些可预料和不可
15、预料的出错称为_4.按异常处理不同可以分为运行异常、捕获异常、声明异常和_几种。5.抛出异常的程序代码可以是_类或者是JDK中的某个类,还可以是JVN.6.抛出异常、生成异常对象都可以通过_语句实现。7.捕获异常的统一出口通过_语句实现。8.Throwable类有两个子类:_类和Exception类。9.对程序语言而言,一般有编译错误和_错误两类。10.一个try语句块后必须跟_语句块,_语句块可以没有11.自定义异常类必须继承_类及其子类12.从命令行得到6个整数,放入一整型数组,然后打印输出,要求:如果输入数据丌为整数,要捕获Integer.parseInt()产生的异常,显示“请输入整数
16、”,捕获输入参数大于6个的异常(数组越界),显示“请输入最多输入6个整数”。13.(自定义异常)创建两个自定义异常类MyException1 和MyException2。要求:1)MyExceptionOne为已检查异常,MyExceptionTwo为未检查异常 2)这两个异常均具有两个构造函数,一个无参,另一个带字符串参数,参数表示产生异常的详细信息。14.创建一个类,其中的try块内抛出Exception类的一个对象,为Exception的构造方法赋予一个字符串参数,用catch语句捕获该异常,并打印出字符串参数,添加一个finally从句,并打印一条消息,证明程序到达那里。15.编写一个能够产生字符串越界异常(StringIndexOutOfBoundsException)的程序,并对产生的异常进行处理。