单元9 异常处理ppt课件.ppt
在此输入您的封面副标题单元单元9 异常处理异常处理单元单元9 异常处理异常处理29.1 异常异常9.1.1 了解异常了解异常绝大多数绝大多数Java程序的运行错误是在所难免的,有时甚至根本程序的运行错误是在所难免的,有时甚至根本得不到程序员所需要的完全结果。得不到程序员所需要的完全结果。Java中的异常是指因为程序中的非语法错误(某些微小错误)中的异常是指因为程序中的非语法错误(某些微小错误)而导致提前中断程序正常执行的一种事件。而导致提前中断程序正常执行的一种事件。若程序运行时出现了异常,为了保证操作系统对程序的正常管若程序运行时出现了异常,为了保证操作系统对程序的正常管理,此时程序至少应该立即终止运行,保存已经完成的一理,此时程序至少应该立即终止运行,保存已经完成的一些工作,并将出错信息告知用户,允许用户采取安全的退些工作,并将出错信息告知用户,允许用户采取安全的退出程序的措施,以避免一些风险。出程序的措施,以避免一些风险。 单元单元9 异常处理异常处理3【案例案例9-1】程序不正常输出并提前中断指令流。程序不正常输出并提前中断指令流。public class E1 public static void main(String args) String c=China,Japan,American; for(int i=0;i4;i+) System.out.println(ci); /下标越界下标越界运行结果如图运行结果如图9-1所示。所示。单元单元9 异常处理异常处理49.1.2 异常发生原因及异常类异常发生原因及异常类1.异常发生的原因异常发生的原因主要的原因归纳如下:主要的原因归纳如下:(1)表达式违反了)表达式违反了Java语言的语义。语言的语义。(2)装入或链接程序时出错。)装入或链接程序时出错。(3)超出资源限制。)超出资源限制。CPU和内存资源不足等。和内存资源不足等。(4)执行)执行throws语句或语句或throw语句。语句。(5)代码段不同步。)代码段不同步。分为两种类型:编译时检查性异常(分为两种类型:编译时检查性异常(checked exception)和运行时非)和运行时非检查性异常(检查性异常(unchecked exception)。)。单元单元9 异常处理异常处理52.异常类异常类在在Java中,所有的异常类都直接或间接地继承自中,所有的异常类都直接或间接地继承自Throwable类,都是类,都是在在java.lang包中,可以把包中,可以把Throwable类分为类分为Exception和和Error两两大类,每个大类又分若干小类,每个异常类反映了一类运行错误,类中定大类,每个大类又分若干小类,每个异常类反映了一类运行错误,类中定义了一系列的错误信息。义了一系列的错误信息。继承层次结构如图继承层次结构如图9-2所示。所示。 单元单元9 异常处理异常处理6(1)Error类。类。Error类是程序中的致命性错误(简称错误)。程序运行过程中出现了严类是程序中的致命性错误(简称错误)。程序运行过程中出现了严重的运行环境或与系统本身有关的资源枯竭错误。这类问题是不需处理的,重的运行环境或与系统本身有关的资源枯竭错误。这类问题是不需处理的,因为它几乎就是无法处理的。因为它几乎就是无法处理的。(2)Exception类及其子类。类及其子类。非致命的错误,有三个子类,一般是程序员的疏忽,是程序员在编写程序非致命的错误,有三个子类,一般是程序员的疏忽,是程序员在编写程序时的忽略某些细节所导致的,因此我们在编程中主要针对时的忽略某些细节所导致的,因此我们在编程中主要针对Exception类及类及其子类进行处理。其子类进行处理。单元单元9 异常处理异常处理7Runtime Exception类:除数为类:除数为0、强制类型转换错误、数组下标越界等。、强制类型转换错误、数组下标越界等。Non_Runtime Exception类:类:URL格式不正确、通过程序打开一个文件但该文格式不正确、通过程序打开一个文件但该文件并不存在、意外中断网络连接、找不到指定的类名或接口名等。件并不存在、意外中断网络连接、找不到指定的类名或接口名等。IOException类:输入输出异常常。类:输入输出异常常。由以上三个类可以派生出下面的异常类:由以上三个类可以派生出下面的异常类:ArrayIndexOutOfBoundsException类:于操作数或数组下标越界异常。类:于操作数或数组下标越界异常。ArithmeticException类:表达式违反了类:表达式违反了Java语言的语义的算术运算溢出异常。语言的语义的算术运算溢出异常。FileNotFoundException:对应于找不到指定文件的异常。:对应于找不到指定文件的异常。NullPointerException:对应于对象或变量没有指向的:对应于对象或变量没有指向的null异常。异常。NumberFormatException:对应于数据格式转换或存储异常。:对应于数据格式转换或存储异常。OutOfMemoryException:对应于内存超出范围异常。:对应于内存超出范围异常。NoClassDefFoundException:对应于使用未声明的类时的异常。:对应于使用未声明的类时的异常。单元单元9 异常处理异常处理8【案例案例9-2】一个未被捕获的一个未被捕获的ArithmeticException异常。异常。class E2 public static void main(String args) int a = 56 / 0; 运行结果如图运行结果如图9-3所示。所示。单元单元9 异常处理异常处理99.2 异常处理异常处理异常处理的原理:异常处理的原理:利用特别的机制在程序中跟踪某些有可能发生异常的程序块,并将这些利用特别的机制在程序中跟踪某些有可能发生异常的程序块,并将这些程序块集中放置在程序中的某个地方,使完成正常操作的程序块与这些程序块集中放置在程序中的某个地方,使完成正常操作的程序块与这些可能发生异常的程序块分开,最后还要能够捕获与处理异常。可能发生异常的程序块分开,最后还要能够捕获与处理异常。单元单元9 异常处理异常处理109.2.1 trycatchfinally语句语句【案例案例9-3】方法调用产生的方法调用产生的ArithmeticException异常。异常。class E3 public static void main(String args) new E3_1().f(5,0); class E3_1 public int f(int a, int b) int x=a/b; return x; 运行结果如图运行结果如图9-4所示。所示。单元单元9 异常处理异常处理111.trycatchfinally语句格式语句格式 try /写被监视的代码段,此区域内可能产生若干类异常对象;写被监视的代码段,此区域内可能产生若干类异常对象; catch( 异常类异常类1 异常对象异常对象1) /写捕获与处理第一类异常的代码段写捕获与处理第一类异常的代码段;catch(异常类异常类2 异常对象异常对象2) /写捕获与处理第二类异常的代码段写捕获与处理第二类异常的代码段;finally 无论是否发生异常或发生何种异常无论是否发生异常或发生何种异常,这部分代码都要执行这部分代码都要执行; finally块是异常处理机制的统一出口。它是可以省略的,若不省略,则无论是否发块是异常处理机制的统一出口。它是可以省略的,若不省略,则无论是否发生异常或发生何种异常生异常或发生何种异常,这部分代码都要执行。这部分代码都要执行。单元单元9 异常处理异常处理12【案例案例9-4】异常捕获与处理简单示例。异常捕获与处理简单示例。class E4 public static void main(String args) try System.out.println(new E3_1().f(5,0); /以上语句调用了方法,有异常,打印操作为执行以上语句调用了方法,有异常,打印操作为执行catch(ArithmeticException e) /和发生异常的类型匹配和发生异常的类型匹配 System.out.println(e);/打印异常信息打印异常信息System.out.println(异常被捕获并处理异常被捕获并处理); catch(ArrayIndexOutOfBoundsException e)/未匹配未匹配 System.out.println(e); /不执行不执行finally System.out.println(程序已经正常了程序已经正常了); /统一出口统一出口class E3_1 public int f(int a,int b) int x=a/b; return x; 运行结果如图运行结果如图9-5所示。所示。单元单元9 异常处理异常处理132.Throwable类的常用方法类的常用方法(1)getCause()。用来返回不存在异常、异常内容为空的信息。用来返回不存在异常、异常内容为空的信息。(2)getLocalizedMessage()。用来返回本地异常信息。用来返回本地异常信息。(3)getMessage()。用来返回导致异常发生的原因。用来返回导致异常发生的原因。(4)getStackTrace()。用来返回内存中堆栈跟踪信息。用来返回内存中堆栈跟踪信息。(5)initCause(Throwable cause)。返回发生异常的初始原因。返回发生异常的初始原因。(6)printStackTrace()。用来返回内存中堆栈的标准错误流信息。用来返回内存中堆栈的标准错误流信息。(7)printStackTrace(PrintStream s)。用来返回内存堆栈的标准。用来返回内存堆栈的标准打印流信息。打印流信息。(8)toString()。用来返回已发生的异常的简单字符串信息。用来返回已发生的异常的简单字符串信息。单元单元9 异常处理异常处理149.2.2 重新抛出异常重新抛出异常实际上,程序员对实际上,程序员对E3_1类中可能发生的异常及其类型做一个标记,那么类中可能发生的异常及其类型做一个标记,那么另外一个程序员就能得到这种提示,并用另外一个程序员就能得到这种提示,并用trycatch语句进行捕获与处理,语句进行捕获与处理,这个标记或提示用关键字这个标记或提示用关键字throws来实现。这就是重新抛出异常。来实现。这就是重新抛出异常。单元单元9 异常处理异常处理151.throws语句语句throws语句抛出异常的格式如下:语句抛出异常的格式如下:方法头方法头 throws 异常类异常类1,异常类,异常类2, 。方法头部分包括返回值类型、方法名、参数列表。方法头部分包括返回值类型、方法名、参数列表。应当注意应当注意throws语句必须位于语句必须位于之前。之前。例如:用例如:用throws抛出多个异常。抛出多个异常。 class A public void c() throws EOFException, IOException 单元单元9 异常处理异常处理16如果在调用一个方法的方法体时生成了异常,该方法并不处如果在调用一个方法的方法体时生成了异常,该方法并不处理由它自己产生的异常,而是沿着调用层次向上逐级传递,理由它自己产生的异常,而是沿着调用层次向上逐级传递,由它的使用者用由它的使用者用trycatchfinally语句来处理。流程见语句来处理。流程见图图9-7所示。所示。单元单元9 异常处理异常处理172.throw语句语句和和throws语句不同的是,语句不同的是,throw语句并非动态抛出异常,而是主动产生语句并非动态抛出异常,而是主动产生一个异常的。一个异常的。格式如下:格式如下:throw new 某异常类构造方法某异常类构造方法;例如:例如:throw new ArithmeticException();/用来抛出一个算术用来抛出一个算术异常对象。异常对象。仍然需要在该程序中用仍然需要在该程序中用trycatchfinally语句进行捕获、处理。语句进行捕获、处理。 单元单元9 异常处理异常处理18【案例案例9-7】用用throw语句强制抛出异常。语句强制抛出异常。public class E7 public static void main(String args) trys(7,6);s(6,7); catch(ArrayIndexOutOfBoundsException e) System.out.println(e. getMessage();finally System.out.println(程序已经正常了程序已经正常了);static void s (int x,int y) throws ArrayIndexOutOfBoundsException if(xy) throw new ArrayIndexOutOfBoundsException(强制抛出强制抛出); else int a =new intx;ay=8; System.out.println(无异常无异常); 运行结果如下:无异常运行结果如下:无异常 强制抛出强制抛出 程序已经正常了程序已经正常了 单元单元9 异常处理异常处理19自定义异常类自定义异常类声明格式如下:声明格式如下:class 异常类名异常类名extends Exception 。我们可利用自定义异常类创建一个异常对象,然后由我们可利用自定义异常类创建一个异常对象,然后由throw语语句强制抛出该对象并用句强制抛出该对象并用throws语句动态抛出,最后在程序中语句动态抛出,最后在程序中用用trycatchfinally语句捕获并处理。语句捕获并处理。单元单元9 异常处理异常处理20小结小结本章讨论了异常及异常处理的基本知识。本章讨论了异常及异常处理的基本知识。Java中的异常是不可避免的,异常处理机制使得中的异常是不可避免的,异常处理机制使得“可能发生异常可能发生异常”的代的代码和码和“正常正常”的代码分开。针对程序中可预见的异常,可以利用的代码分开。针对程序中可预见的异常,可以利用trycatchfinally语句来捕获与处理。语句来捕获与处理。Java中的异常类包括系统提中的异常类包括系统提供的异常类和用户自己定义的新异常类型。自己定义异常一般是继承自供的异常类和用户自己定义的新异常类型。自己定义异常一般是继承自Exception类。无论是什么形式的异常,它们都具有一般类的属性和行类。无论是什么形式的异常,它们都具有一般类的属性和行为。为。throws语句用来动态抛出一个异常,而语句用来动态抛出一个异常,而throw语句并非动态抛出异语句并非动态抛出异常,而是通过人为制造而强制性、主动性地抛出。常,而是通过人为制造而强制性、主动性地抛出。