异常处理机制.ppt
7 7异常处理机制 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望7 7主要内容4引入异常机制4Java的异常处理异常的抛出、捕获与处理4自定义异常4使用finally2例外处理机制7 7对错误的处理4程序执行的错误4处理错误向用户通知错误保存全部工作让用户适当地退出程序4异常处理JAVA检测和报告错误的机制3例外处理机制7 7处理错误的方式4函数式编程中,直接检测调用函数返回值以确定错误内容,存在的问题检测错误返回的编码工作量大,逻辑上复杂返回的错误信息有限,无详细的位置、性质等4异常处理throws,使不能正常结束的方法抛出一个封装了错误信息的对象异常使用异常处理程序处理异常错误4例外处理机制7 7异常处理机制4Java中定义了很多异常类,每个异常类都代表了一种运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。一旦一个异常对象产生了,系统中就一定有相应的机制来处理它,确保不会产生死机、死循环或其他对操作系统的损害,从而保证了整个程序运行的安全性。这就是Java的异常处理机制5例外处理机制7 7异常处理机制4当方法执行过程中出现错误而干扰了程序流程时,会抛出一个异常,即构造出一个异常类的对象。4异常类对象代表当前出现的一个具体异常,该对象封装了异常的有关信息。4异常分为系统定义异常和用户自定义异常。4异常抛出方式:自动抛出(系统定义异常)用throw语句抛出(用户定义异常)4方法中的异常处理:捕获异常,就地解决,并使程序继续执行。将异常向外转移,即将异常抛出方法之外,由调用该方法的环境去处理。6例外处理机制7 7异常类Throwable类Exception类Error类自定义异常类ArrayIndexOutOfBoundsException类NullPointerException类7例外处理机制7 7异常类4Exception类定义的是较轻的错误,你可以编写代码来处理这类错误,并继续程序的执行。4Exception原因:打开的文件不存在。网络连接中断。操作数超过允许范围。想要加载的类文件不存在。试图通过空的引用型变量访问对象。数组下标越界。4Error类定义的错误是致命性错误,一般会导致程序停止执行。8例外处理机制7 7Exception类4构造方法Exception()Exception(String 异常描述)4Exception类的方法均继承自Throwable类4方法String getMessage()返回异常描述。String toString()返回异常对象详细信息。void printStackTrace()打印异常发生的路径,即引起异常的方法调用嵌套序列。9例外处理机制7 7系统定义的异常类4ClassNotFoundException 未找到要加载的类4ArrayIndexOutOfBoundsException 数组越界使用4FileNotFoundException 未找到指定的文件或目录4IOException 输入、输出错误4NullPointerException 引用空的尚无内存空间的对象 系统将常见错误予 定义为若干异常类 当出现异常时自动 抛出10例外处理机制7 7系统定义的异常类4ArithmeticException 算术错误,如除数为04InterruptedException 一线程在睡眠、等待或其他原因暂停时被其他线程打断4UnknownHostException 无法确定主机的IP地址4SecurityException 安全性错误,如Applet欲读写文件4MalformedURLException URL格式错误11例外处理机制7 7用户定义的异常类4用户自定义异常主要用来处理用户程序中特定的逻辑 运行错误。4定义异常类 class MyExp extends Exception /或继承其他异常类 /定义新的属性 /重载构造方法 例:MyExp(String msg)super(msg)/重载原方法,或定义新方法 4抛出异常类:throw 异常类对象;例:throw new MyExp(“年龄超过规定”);例:throw new Exception();12例外处理机制7 7异常的产生4自动抛出异常运行异常程序运行中可自动由Java解释器引发并处理的异常;编程时不需捕获或声明。如:除以0、下标越界、指针例外等非运行异常可在编译期由编译器确定某方法是否会发生此类异常;必须编程时捕获或声明 如:IOException,InterruptedException13例外处理机制7 7异常的产生4编程抛出异常:在程序的相应部分抛出异常:throw new XXXException();throw new XXXException(String describe);4例:String readData()throws EOFException.throw new EOFException(“error”);.14例外处理机制7 74警戒区:可能会引起异常的代码段 try 警戒区代码 /抛出例外 catch(ExceptType e)/捕获例外 例外处理代码/异常处理 后续语句4若try块中出现异常,则控制转向下面的异常处理部 分,然后执行后续语句。4若try块中没有异常,则try块执行完,控制转向后续 语句。异常处理15例外处理机制7 7多个异常的处理4可用一组并列的catch块处理多异常情况try .catch(异常类1 e1).catch(异常类2 e2).4匹配规则:抛出对象与catch参数类型相同抛出对象为catch参数类的子类按先后顺序捕获(注意catch块书写时的排列顺序:先具体、后一般),但只捕获一次。16例外处理机制7 7异常处理过程4当遇到关键字 throw 时就抛出一个异常4将控制转移到相关的 catch 块中处理之4如果产生异常的方法本身没有相应catch 语句块,则应有throws语句声明例外4退出当前方法并转向上一级调用此方法的方法的 catch 语句块4若始终没有catch块来处理则由运行系统处理17例外处理机制7 7例4例:ExceptionMethods.java 抛出捕获处理异常的各方法18例外处理机制7 7public class ExceptionMethods public static void main(String args)try /抛出例外 throw new Exception(Heres my Exception);catch(Exception e)/捕获例外 /处理例外 System.out.println(Caught Exception);System.out.println(e.getMessage():+e.getMessage();System.out.println(e.toString():+e.toString();System.out.println(e.printStackTrace():);e.printStackTrace();/end of main()/end of class19例外处理机制7 7自定义异常类4声明一个新的异常类,该异常类必须从Java已有定义的异常类继承,如Exception、IOException等4为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。4例:Inheriting.java20例外处理机制7 7class MyException extends Exception /自定义例外 public MyException()public MyException(String msg)super(msg);public class Inheriting public static void f()throws MyException System.out.println(Throwing MyException from f();throw new MyException();/抛出自定义例外 public static void main(String args)try f();/处理自定义例外 catch(MyException e)e.printStackTrace();/end of main()/end of class Inheriting21例外处理机制7 7异常转移4异常总是发生在方法执行过程中。4当异常不处理时会向方法外转移。4系统定义的异常自动向外转移。4用户自定义的异常要转移需要在方法头声明一下 String readData()throws MyExp .throw new MyExp(“年龄超过规定”);22例外处理机制7 7finallytry.catch(A a).finally4finally:不论是否有异常抛出,均执行4只有当try块中执行System.exit()时,会立即结束程序。4用处:一般用来进行一些“善后”操作,如系统资源的释放、文件的关闭等4例:FinallyWorks.java23例外处理机制7 7public class FinallyWorks static int count=0;public static void main(String args)while(true)try /count is zero first time:if(count+=0)throw new Exception();System.out.println(No exception);catch(Exception e)System.out.println(Exception thrown);finally /是否抛出例外都会执行 System.out.println(in finally clause);if(count=2)break;/out of while /end of while /end of main()/end of class24例外处理机制7 7课后作业4 P116.第10、11、12题25例外处理机制