您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Java-第8章-异常处理与断言
第8章异常处理与断言内容提要•异常是在程序运行过程中产生的使程序终止正常运行的事件,是一种特殊的运行对象。本章要点•本章首先介绍什么是异常、异常的类型以及如何处理异常,其中包括运行时异常和非运行时异常、使用try-catch处理异常、声明方法抛出异常、try-with-resources语句的使用以及创建自定义的异常。•最后,简单介绍了有关断言的概念。8.1异常与异常类8.1.1异常的概念8.1.2Throwable类及其子类8.1.1异常的概念•所谓异常(exception)是在程序运行过程中产生的使程序终止正常运行的错误对象。如数组下标越界、整数除法中零作除数、文件找不到等都可能使程序终止运行。•为了理解异常的概念,首先看下面的程序。8.1.1异常的概念程序8.1NullPointerDemo.javapublicclassNullPointerDemo{publicstaticvoidmain(String[]args){Circlecircle=null;System.out.println(circle.area());System.out.println(Programfinished.);}}该程序编译不会发生错误,可以生成NullPointerDemo.class字节码文件,但运行时结果如下:Exceptioninthreadmainjava.lang.NullPointerExceptionatNullPointerDemo.main(NullPointerDemo.java:4)8.1.1异常的概念–该输出内容说明程序发生了异常,第一行给出了异常名称,第二行给出了异常发生的位置。–Java语言规定当某个对象的引用为null时,调用该对象的方法或使用对象时就会产生NullPointerException异常。该程序中当调用circle的area()方法时,运行时系统产生了一个NullPointerException异常类对象并抛出,运行时系统就在产生异常对象的方法中寻找处理该异常对象的代码,若有则进入异常处理的代码,若没有(如本程序),运行时系统继续将异常对象抛给调用该方法的方法。–由于main()方法是由JVM调用的,所以将异常抛给了JVM,JVM在标准输出设备上输出异常的名称。8.1.1异常的概念•再看下面一个程序,该程序试图从键盘上输入一个字符,然后输出。程序8.2InputChar.javaimportjava.io.*;publicclassInputChar{publicstaticvoidmain(String[]args){System.out.print(Inputachar:);charc=(char)System.in.read();System.out.println(c=+c);}}8.1.1异常的概念–当编译该程序时会出现下列编译错误:UnhandledexceptiontypeIOException–上述编译错误说明程序没有处理IOException异常,该异常必须捕获或声明抛出,同时编译器指出了需要捕获异常的位置。–出现上述编译错误的原因是,read()方法在定义时声明抛出了IOException异常,因此程序中若调用该方法必须声明抛出异常或捕获异常。8.1.2Throwable类及其子类•Java语言的异常处理采用面向对象的方法,为各种异常建立了类层次。Java异常都是Throwable类的子类对象,Throwable类是Object类的直接子类,它定义在java.lang包中。•Throwable类有两个子类–一个是Error类–另一个是Exception类,•这两个子类又分别有若干个子类。8.1.2Throwable类及其子类1.Error类•Error类描述的是系统内部错误,这样的错误很少出现。如果发生了这类错误,则除了通知用户及终止程序外,几乎什么也不能做,程序中一般不对这类错误处理。2.Exception类•图8.1给出了Exception类及其常见子类的层次结构。•Exception类的子类一般又可分为两种类型:运行时异常和非运行时异常。8.1.2Throwable类及其子类图8.2RuntimeException类及其子类图8.1Exception类及其子类的层次8.1.2Throwable类及其子类(1)运行时异常•RuntimeException类及其子类异常称为运行时异常。常见的运行时异常如图8.2所示。运行时异常是在程序运行时检测到的,可能发生在程序的任何地方且数量较大,因此编译器不对运行时异常(包括Error类的子类)处理,这种异常又称为免检异常(uncheckedexception)。但程序运行时发生这种异常时运行时系统会把异常对象交给默认的异常处理程序,在控制台显示异常的内容及发生异常的位置。•程序8.1中的异常NullPointerException就是运行时异常。8.1.2Throwable类及其子类•下面介绍几种常见的运行时异常。–NullPointerException空指针异常,即当某个对象的引用为null时调用该对象的方法或使用对象时就会产生该异常,如:inta[]=null;a[0]=0;//该语句发生异常–ArithmeticException算术异常,在做整数的除法或整数求余运算时可能产生的异常,它是在除数为零时产生的异常。inta=5;intb=a/0;//该语句发生异常注意:浮点数运算不会产生该类异常。如,1.0/0.0的结果为Infinity。8.1.2Throwable类及其子类–ClassCastException对象转换异常,Java支持对象类型转换,若不符合转换的规定,则产生类转换异常,例如:Objecto=newObject();Strings=(String)o;//该语句发生异常–ArrayIndexOutOfBoundsException数组下标越界异常,当引用数组元素的下标超出范围时产生的异常,例如:inta[]=newint[5];a[5]=10;//该语句发生异常因为定义的数组a的长度为5,不存在a[5]这个元素,因此发生数组下标越界异常。8.1.2Throwable类及其子类–NumberFormatException数字格式错误异常。在将字符串转换为数值时,如果字符串不能正确转换成数值则产生该异常,例如:doubled=Double.parseDouble(5m7.8);//该语句发生异常异常的原因是字符串5m7.8不能正确转换成double型数据。注意:尽管对运行时异常可以不处理,但程序运行时产生这类异常,程序也不能正常结束。为了保证程序正常运行,要么避免产生运行时异常,要么对运行时异常进行处理。8.1.2Throwable类及其子类(2)非运行时异常除RuntimeException类及其子类以外的类称为非运行时异常,有时也称为必检异常(checkedexception)。对这类异常,程序必须捕获或声明抛出,否则编译不能通过。程序8.2中的异常IOException就是非运行时异常。再比如,若试图使用Java命令运行一个不存在的类,则会产生ClassNotFoundException异常,若调用了一个不存在的方法,则会产生NoSuchMethodException异常。8.2异常处理机制8.2.1异常的抛出与捕获8.2.2try-catch-finally语句8.2.3用catch捕获多个异常8.2.4声明方法抛出异常8.2.5用throw语句抛出异常8.2.6try-with-resources语句8.2异常处理机制•异常处理可分为下面几种:–使用try-catch-finally捕获并处理异常;–通过throws子句声明抛出异常;–用throw语句抛出异常;–使用try-with-resources管理资源。8.2.1异常的抛出与捕获•在Java程序中,异常都是在方法中产生的。方法运行过程中如果产生了异常,在这个方法中就生成一个代表该异常类的对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。生成异常对象并把它交给运行时系统的过程称为抛出异常。运行时系统在方法的调用栈中查找,从产生异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止,这一过程称为捕获异常。8.2.1异常的抛出与捕获•方法调用与回溯如图8.3所示。图8.3方法调用与回溯示意图这里main()方法调用了methodA()方法,methodA()方法调用了methodB()方法,methodB()方法调用了methodC()方法。假如在methodC()方法发生异常,运行时系统首先在该方法中寻找处理异常的代码,如果找不到,运行时系统将在方法调用栈中回溯,把异常对象交给methodB()方法,如果methodB()方法也没有处理异常代码,将继续回溯,直到找到处理异常的代码。最后,如果main()方法中也没有处理异常的代码,运行时系统将异常交给JVM,JVM将在控制台显示异常信息。8.2.2try-catch-finally语句•在Java程序中捕获并处理异常最常用的方法是用try-catch-finally语句,该结构的一般格式为:try{//需要处理的代码}catch(ExceptionType1exceptionObject){//异常处理代码}catch(ExceptionType2exceptionObject){//异常处理代码}[finally{//最后处理代码}]8.2.2try-catch-finally语句说明:(1)try块将程序中可能产生异常的代码段用大括号括起来,该块内可能抛出一种或多种异常。(2)catch块用来捕获异常,括号中指明捕获的异常类型及异常引用名,类似于方法的参数,它指明了catch语句所处理的异常。大括号中是处理异常的代码。catch语句可以有多个,用来处理不同类型的异常。注意:若有多个catch块,异常类型的排列顺序必须按照从特殊到一般的顺序,即子类异常放在前面,超类异常放在后面,否则产生编译错误。8.2.2try-catch-finally语句•当try块中产生异常,运行时系统从上到下依次检测异常对象与哪个catch块声明的异常类相匹配,若找到匹配的或其父类异常,既进入相应catch块处理异常,catch块执行完毕说明异常得到处理。(3)finally块是可选项。异常的产生往往会中断应用程序的执行,而在异常产生前,可能有些资源未被释放。有时无论程序是否发生异常,都要执行一段代码,这时就可以通过finally块实现。无论异常产生与否finally块都会被执行。即使是使用了return语句,finally块也要被执行,除非catch块中调用了System.exit()方法终止程序的运行。8.2.2try-catch-finally语句•另外需要注意,一个try块必须有一个catch块或finally块,catch块或finally块也不能单独使用,必须与try块搭配使用。•下面使用try-catch结构捕获并处理一个ArithmeticException异常。8.2.2try-catch-finally语句程序8.3DivideDemo.javapublicclassDivideDemo{publicstaticvoidmain(String[]args){inta=5;try{intb=a/0;System.out.println(b=+b);}catch(ArithmeticExceptione){e.printStackTrace();}System.out.println(a=+a);}}Run8.2.2try-catch-finally语句程序运行结果为:java.lang.ArithmeticException:/byzeroatDemo.main(Demo.java:5)a=5从上述结果可以看到,程序运行中发生的异常得到了处理,接下来程序继
本文标题:Java-第8章-异常处理与断言
链接地址:https://www.777doc.com/doc-6354170 .html