1、第十一讲 异常处理,本章要点,理解异常和错误处理 理解JAVA的异常层次结构及异常分类 掌握基本的异常处理编程,异常,异常(Exception)又称例外-是在程序运行过程中发生的、会打断程序正常执行的事件。 例如:除0 (ArithmeticException)、没有给对象开辟内存空间时会出现空指针异常(NullPointException)、文件找不到(FileNotFoundException)、数组元素下标越界(ArrayIndexOutOfBoundsException)等。这些事件的发生将阻碍程序的正常运行。为了增加程序的容错性、健壮性,程序设计时,必须考虑到可能发生的异常情况并做出
2、相应的处理。 设计程序时必须考虑可能发生的异常事件并作出相应的处理。传统程序设计时,要由编程者自己测试出错发生的原因,通过if语句判断是否出现了异常事件,并进行相应的处理。,异常,传统异常处理存在的困难和问题 写程序难 大部分精力花在出错处理上了 只把能够想到的错误考虑到 对以外的情况无法处理 程序可读性差 大量的错误处理代码混杂在程序中 出错返回的信息量太少 无法更确切的了解错误状况或原因,5,异常层次结构及分类,异常类的结构,Object,Error,Exception,Throwable,RuntimeException,受控异常,Error与Exception,Throwable以下的
3、异常都可以被捕获 所有Error类及其子类代表java运行时系统中可能发生的异常情况,是致命的,即程序遇到了非常严重的不正常状态,不能简单恢复执行,这就是错误。如:内存耗尽、系统内部错误等,通常我们(应用程序)不应捕获这些异常。 所有Exception类及其子类代表java程序中可能发生的异常情况,是非致命的,通过某种修正后程序还能继续执行。这类错误叫作异常。如:文件不存在、无效的下标、空引用、网络断开、打印机脱机、磁盘满了等,通常我们(应用程序)可以捕获这些异常。,Exception分类,Exception是要重点掌握的,它也分为两类: (1)受控异常(检查异常):java编译器对受控异常强
4、制执行捕获或者声明,Exception,ClassNotFoundException,AWTException,IOException,NoSuchMethodException,Exception分类,(2)不受控异常(非检查异常):java编译器不会检查代码以确定是捕获或者声明不受控异常。尽管编译器对不受控异常没有捕获或者声明的强制要求,但在知道可能发生这种异常时应提供合适的异常处理代码。,9,不受控异常,IndexOutOfBoundsException,NullPointerException,NoSuchElementException,illegalArgumentExceptio
5、n,ArithmeticException,RuntimeException,ArrayIndexOutOfBoundsException,StringIndexOutOfBoundsException,NumberFormatException,异常处理,try-catch结构try/可能产生异常的代码 catch(someException e)/处理异常的代码 catch(someException e)/处理异常的代码,异常处理,try-catch-finally结构try/可能产生异常的代码catch(someException e)/处理异常的代码 finally/必须执行的代码,
6、异常处理,try-finally结构try/可能产生异常的代码finally/必须执行的代码,异常处理,注意: catch和finally必须至少有一个跟在try 后面 如果不发生异常,则catch块中的代码不会被执行 不论是否发生异常finally块中的代码一定会被执行,自定义异常,用户为什么要自定义异常?,Java类库中定义的异常主要用来处理编程中一些常见的运行错误,这些错误是系统可以预见和自动识别的。,若用户程序有其特殊的逻辑要求,需要通过Java的异常处理机制来处理用户自定义的异常。,自定义异常,如何自定义异常?,1. 创建一个类,必须继承Exception类,2. 在可能抛出自定义异
7、常方法的方法头中声明该异常,3. 在方法体中指明需要抛出自定义异常对象的位置,创建异常对象使用throw子句抛出异常,自定义异常(例),例:编写一个程序,在命令行输入一个学生的成绩,输出相应的等级。其中,成绩大于90分输出”A”,80-90输出“B”,70-80输出“C”,60-70输出“D”,60以下输出“E”,要求输入分数的值在0-100之间。自定义异常类NumberRangeException,当输入数据不在0-100之间时,输出等级的方法void show(int score)将抛出自定义异常。,自定义异常(例),自定义异常类NumberRangeException的定义:,class
8、 NumberRangeException extends ExceptionNumberRangeException(String msg)super(msg); ,继承类Exception,自定义异常(例),在可能抛出自定义异常方法的方法头中声明该异常,public static void show(int score) throws NumberRangeException if(score100)NumberRangeException e=new NumberRangeException(“输入的数字不在指定的范围!请重新输入。“);throw e;,接下页,throws与throw
9、,1.throws 用于抛出方法层次的异常,并且直接由这些方法调用异常处理类来处理该异常,所以它常用在方法的后面。比如 public static void main(String args) throws IOException 2.throw 用于方法块里面的代码,比throws的层次要低,表示它抛出异常, 但它不会处理它,而是由方法块的throws Exception来调用异常处理类来处理。,elseint s=score/10;switch(s)case 10:case 9:System.out.println(“A“);break;case 8:System.out.println(
10、“B“);break;case 7:System.out.println(“C“);break;case 6:System.out.println(“D“);break;default:System.out.println(“E“); ,自定义异常(例),接上页,public static void main(String args) int score = Integer.parseInt(args0);tryshow(score);catch(NumberRangeException e)System.out.println(e.getMessage(); ,自定义异常(例),show()方法的调用,