Java第8章异常处理与断言.ppt
《Java第8章异常处理与断言.ppt》由会员分享,可在线阅读,更多相关《Java第8章异常处理与断言.ppt(75页珍藏版)》请在三一办公上搜索。
1、第8章异常处理与断言,内容提要,异常是在程序运行过程中产生的使程序终止正常运行的事件,是一种特殊的运行对象。,本章要点,本章首先介绍什么是异常、异常的类型以及如何处理异常,其中包括运行时异常和非运行时异常、使用try-catch处理异常、声明方法抛出异常、try-with-resources语句的使用以及创建自定义的异常。最后,简单介绍了有关断言的概念。,8.1 异常与异常类,8.1.1 异常的概念8.1.2 Throwable类及其子类,8.1.1 异常的概念,所谓异常(exception)是在程序运行过程中产生的使程序终止正常运行的错误对象。如数组下标越界、整数除法中零作除数、文件找不到等
2、都可能使程序终止运行。为了理解异常的概念,首先看下面的程序。,8.1.1 异常的概念,程序8.1 NullPointerDemo.java,public class NullPointerDemo public static void main(String args)Circle circle=null;System.out.println(circle.area();System.out.println(Program finished.);,该程序编译不会发生错误,可以生成NullPointerDemo.class字节码文件,但运行时结果如下:at NullPointerDemo.mai
3、n(NullPointerDemo.java:4),8.1.1 异常的概念,该输出内容说明程序发生了异常,第一行给出了异常名称,第二行给出了异常发生的位置。Java语言规定当某个对象的引用为null时,调用该对象的方法或使用对象时就会产生NullPointerException异常。该程序中当调用circle的area()方法时,运行时系统产生了一个NullPointerException异常类对象并抛出,运行时系统就在产生异常对象的方法中寻找处理该异常对象的代码,若有则进入异常处理的代码,若没有(如本程序),运行时系统继续将异常对象抛给调用该方法的方法。由于main()方法是由JVM调用的,
4、所以将异常抛给了JVM,JVM在标准输出设备上输出异常的名称。,8.1.1 异常的概念,再看下面一个程序,该程序试图从键盘上输入一个字符,然后输出。程序8.2 InputChar.java import java.io.*;public class InputChar public static void main(String args)System.out.print(Input a char:);char c=(char)System.in.read();System.out.println(c=+c);,8.1.1 异常的概念,当编译该程序时会出现下列编译错误:Unhandled ex
5、ception type IOException上述编译错误说明程序没有处理IOException异常,该异常必须捕获或声明抛出,同时编译器指出了需要捕获异常的位置。出现上述编译错误的原因是,read()方法在定义时声明抛出了IOException异常,因此程序中若调用该方法必须声明抛出异常或捕获异常。,8.1.2 Throwable类及其子类,Java语言的异常处理采用面向对象的方法,为各种异常建立了类层次。Java异常都是Throwable类的子类对象,Throwable类是Object类的直接子类,它定义在java.lang包中。Throwable类有两个子类一个是Error类另一个是E
6、xception类,这两个子类又分别有若干个子类。,8.1.2 Throwable类及其子类,1.Error类Error类描述的是系统内部错误,这样的错误很少出现。如果发生了这类错误,则除了通知用户及终止程序外,几乎什么也不能做,程序中一般不对这类错误处理。Exception类图8.1给出了Exception类及其常见子类的层次结构。Exception类的子类一般又可分为两种类型:运行时异常和非运行时异常。,8.1.2 Throwable类及其子类,图8.2 RuntimeException类及其子类,图8.1 Exception类及其子类的层次,8.1.2 Throwable类及其子类,(1
7、)运行时异常RuntimeException类及其子类异常称为运行时异常。常见的运行时异常如图8.2所示。运行时异常是在程序运行时检测到的,可能发生在程序的任何地方且数量较大,因此编译器不对运行时异常(包括Error类的子类)处理,这种异常又称为免检异常(unchecked exception)。但程序运行时发生这种异常时运行时系统会把异常对象交给默认的异常处理程序,在控制台显示异常的内容及发生异常的位置。程序8.1中的异常NullPointerException就是运行时异常。,8.1.2 Throwable类及其子类,下面介绍几种常见的运行时异常。NullPointerException
8、空指针异常,即当某个对象的引用为null时调用该对象的方法或使用对象时就会产生该异常,如:int a=null;a0=0;/该语句发生异常ArithmeticException 算术异常,在做整数的除法或整数求余运算时可能产生的异常,它是在除数为零时产生的异常。int a=5;int b=a/0;/该语句发生异常 注意:浮点数运算不会产生该类异常。如,1.0/0.0的结果为Infinity。,8.1.2 Throwable类及其子类,ClassCastException 对象转换异常,Java支持对象类型转换,若不符合转换的规定,则产生类转换异常,例如:Object o=new Object(
9、);String s=(String)o;/该语句发生异常ArrayIndexOutOfBoundsException 数组下标越界异常,当引用数组元素的下标超出范围时产生的异常,例如:int a=new int5;a5=10;/该语句发生异常 因为定义的数组a的长度为5,不存在a5这个元素,因此发生数组下标越界异常。,8.1.2 Throwable类及其子类,NumberFormatException 数字格式错误异常。在将字符串转换为数值时,如果字符串不能正确转换成数值则产生该异常,例如:double d=Double.parseDouble(5m7.8);/该语句发生异常 异常的原因是字
10、符串5m7.8不能正确转换成double型数据。,注意:尽管对运行时异常可以不处理,但程序运行时产生这类异常,程序也不能正常结束。为了保证程序正常运行,要么避免产生运行时异常,要么对运行时异常进行处理。,8.1.2 Throwable类及其子类,(2)非运行时异常 除RuntimeException类及其子类以外的类称为非运行时异常,有时也称为必检异常(checked exception)。对这类异常,程序必须捕获或声明抛出,否则编译不能通过。程序8.2中的异常IOException就是非运行时异常。再比如,若试图使用Java命令运行一个不存在的类,则会产生Class NotFoundExce
11、ption异常,若调用了一个不存在的方法,则会产生NoSuchMethod Exception异常。,8.2 异常处理机制,8.2.1 异常的抛出与捕获8.2.2 try-catch-finally语句8.2.3 用catch捕获多个异常8.2.4 声明方法抛出异常8.2.5 用throw语句抛出异常8.2.6 try-with-resources语句,8.2 异常处理机制,异常处理可分为下面几种:使用try-catch-finally捕获并处理异常;通过throws子句声明抛出异常;用throw语句抛出异常;使用try-with-resources管理资源。,8.2.1 异常的抛出与捕获,在
12、Java程序中,异常都是在方法中产生的。方法运行过程中如果产生了异常,在这个方法中就生成一个代表该异常类的对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。生成异常对象并把它交给运行时系统的过程称为抛出异常。运行时系统在方法的调用栈中查找,从产生异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止,这一过程称为捕获异常。,8.2.1 异常的抛出与捕获,方法调用与回溯如图8.3所示。,图8.3 方法调用与 回溯示意图,这里main()方法调用了methodA()方法,methodA()方法调用了methodB()方法,methodB()方法调用了methodC()方法。假
13、如在methodC()方法发生异常,运行时系统首先在该方法中寻找处理异常的代码,如果找不到,运行时系统将在方法调用栈中回溯,把异常对象交给methodB()方法,如果methodB()方法也没有处理异常代码,将继续回溯,直到找到处理异常的代码。最后,如果main()方法中也没有处理异常的代码,运行时系统将异常交给JVM,JVM将在控制台显示异常信息。,8.2.2 try-catch-finally语句,在Java程序中捕获并处理异常最常用的方法是用try-catch-finally语句,该结构的一般格式为:try/需要处理的代码 catch(ExceptionType1 exceptionOb
14、ject)/异常处理代码 catch(ExceptionType2 exceptionObject)/异常处理代码finally/最后处理代码,8.2.2 try-catch-finally语句,说明:(1)try块将程序中可能产生异常的代码段用大括号括起来,该块内可能抛出一种或多种异常。(2)catch块用来捕获异常,括号中指明捕获的异常类型及异常引用名,类似于方法的参数,它指明了catch语句所处理的异常。大括号中是处理异常的代码。catch语句可以有多个,用来处理不同类型的异常。,注意:若有多个catch块,异常类型的排列顺序必须按照从特殊到一般的顺序,即子类异常放在前面,超类异常放在后
15、面,否则产生编译错误。,8.2.2 try-catch-finally语句,当try块中产生异常,运行时系统从上到下依次检测异常对象与哪个catch块声明的异常类相匹配,若找到匹配的或其父类异常,既进入相应catch块处理异常,catch块执行完毕说明异常得到处理。(3)finally块是可选项。异常的产生往往会中断应用程序的执行,而在异常产生前,可能有些资源未被释放。有时无论程序是否发生异常,都要执行一段代码,这时就可以通过finally块实现。无论异常产生与否finally块都会被执行。即使是使用了return语句,finally块也要被执行,除非catch块中调用了System.exit
16、()方法终止程序的运行。,8.2.2 try-catch-finally语句,另外需要注意,一个try块必须有一个catch块或finally块,catch块或finally块也不能单独使用,必须与try块搭配使用。下面使用try-catch结构捕获并处理一个ArithmeticException异常。,8.2.2 try-catch-finally语句,程序8.3 DivideDemo.javapublic class DivideDemopublic static void main(String args)int a=5;tryint b=a/0;System.out.println(b
17、=+b);catch(ArithmeticException e)e.printStackTrace();System.out.println(a=+a);,8.2.2 try-catch-finally语句,程序运行结果为:java.lang.ArithmeticException:/by zero at Demo.main(Demo.java:5)a=5 从上述结果可以看到,程序运行中发生的异常得到了处理,接下来程序继续运行。程序中调用了异常对象的printStackTrace()方法,它从控制台输出异常栈跟踪。从栈跟踪中我么可以了解到发生的异常类型和发生异常的源代码的行号。,8.2.2
18、try-catch-finally语句,在异常类的根类Throwable中还定义了其他方法,如下所示:public void printStackTrace():在标准错误输出流上输出异常调用栈的轨迹。public String getMessage():返回异常对象的细节描述。public String getLocalizedMessage():返回异常对象的针对特定语言的细节描述。public void printStackTrace(PrintStream s):在指定输出流上输出异常调用栈的轨迹。,8.2.2 try-catch-finally语句,public void print
19、StackTrace(PrintWriter s):在指定输出流上输出异常调用栈的轨迹。public String toString():返回异常对象的简短描述,是Object类中同名方法的覆盖。这些方法被异常子类所继承,可以调用异常对象的方法获得异常的有关信息,这可使程序调试方便。有关其他方法的详细内容,请参阅Java API文档。下面是对程序8.2的修改,使用try-catch结构捕获异常。,8.2.2 try-catch-finally语句,程序8.4 InputCharDemo.javaimport java.io.*;public class InputCharDemo public
20、 static void main(String args)System.out.print(请输入一个字符:);try char c=(char)System.in.read();System.out.println(c=+c);catch(IOException e)e.printStackTrace();,8.2.2 try-catch-finally语句,注意:catch块中的异常可以是超类异常,另外catch块中可以不写任何语句,只要有一对大括号,系统就认为异常被处理了,程序编译就不会出现错误,编译后程序正常运行。catch块内的语句只有在真的产生异常时才被执行。下面程序涉及多个异常
21、的捕获和处理。,8.2.2 try-catch-finally语句,程序8.5 MultiExceptionDemo.java,程序的输出如下:无异常发生.执行finally块:0捕获到:/by zero执行finally块:1捕获到:Exception:4执行finally块:2,8.2.3 用catch捕获多个异常,如前所述,一个try语句后面可以跟两个或多个catch语句。虽然每个catch语句经常提供自己的特有的代码序列,但是有时捕获异常的两个或多个catch语句可能执行相同的代码序列。现在可以使用JDK 7提供的一个新功能,用一个catch语句处理多个异常,而不必单独捕获每个异常类型
22、,这就减少了代码重复。要在一个catch语句中处理多个异常,需要使用“或”运算符(|)分隔多个异常。下面的程序演示了捕获多个异常的方法。,8.2.3 用catch捕获多个异常,程序8.6 MultiCatchDemo.java,8.2.3 用catch捕获多个异常,程序运行当尝试除以0时,将产生一个ArithmeticException错误。当尝试越界访问letter数组时,将产生一个ArrayIndex OutOfException错误,两个异常被同一个catch语句捕获。注意,多重捕获的每个形参隐含地为final,所以不能为其赋新值。,8.2.4 声明方法抛出异常,所有的异常都产生在方法(
23、包括构造方法)内部的语句。有时方法中产生的异常不需要在该方法中处理,可能需要由该方法的调用方法处理,这时可以在声明方法时用throws子句声明抛出异常,将异常传递给调用该方法的方法处理。声明方法抛出异常的格式如下:returnType methodName(paramlist)throws ExceptionList/方法体,8.2.4 声明方法抛出异常,按上述方式声明的方法,就可以对方法中产生的异常不作处理,若方法内抛出了异常,则调用该方法的方法必须捕获这些异常或者再声明抛出。上面的例子是在method()方法中处理异常,若不在该方法中处理异常,而由调用该方法的main()方法处理,程序修改
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 异常 处理 断言
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6510072.html