资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,异常,异常的概念,异常的分类,捕获异常,声明异常,抛出异常,创造自己的异常,总结,异常的概念,什么是异常,?,异常实际上是程序中错误导致中断了正常的指令流的一种事件,.,没有处理错误的程序,:,read-file,openTheFile;,determine its size;,allocate that much memory;,closeTheFile;,异常的概念,以常规方法处理错误,openFiles;,if(theFilesOpen),determine the lenth of the file;,if(gotTheFileLength),allocate that much memory;,if(gotEnoughMemory),read the file into memory;,if(readFailed)errorCode=-1;,else errorCode=1;,else errorCode=-3;,else errorCode=-5;,else errorCode=-5;,异常的概念,观察前面的程序你会发现大部分精力花在出错处理上了,.,只把能够想到的错误考虑到,对以外的情况无法处理,程序可读性差,出错返回信息量太少,异常的概念,用异常的形式处理错误,read-File;,try,openTheFile;,determine its size;,allocate that much memory;,closeTheFile,;,catch(fileopenFailed)dosomething;,catch(sizeDetermineFailed)dosomething;,catch(memoryAllocateFailed)dosomething;,catch(readFailed)dosomething;,catch(fileCloseFailed)dosomething;,catch(Exception)dosomething;/,其它未考虑到的错误,异常的概念,和传统的方法比较异常的优点,:,1.,把错误代码从常规代码中分离出来,2.,把错误传播给调,用堆栈,3.,按错误类型和,错误差别分组,4.,系统提供了对于一些无法预测的错误的捕获和处理,5.,克服了传统方法的错误信息有限的问题,method1,method2,method3,method4,探测抛出例外,传 递,捕获处理例外,调 用,什么情况下使用例外机制?,当方法因为自身无法控制的原因而不能完成其任务,文件不存在,网络连接无法建立,处理在方法、类库、类中抛出的例外,如,FileInputStream.read,产生,IOException,在大的项目中采用统一的方式处理例外时,如编写一个文字处理器,例外应该是不经常发生但却可能发生的故障,一定发生的事件不应该用例外机制来处理,例外处理用于使系统从故障中恢复,提示信息,/,不产生无效的结果,/,释放资源,异常的概念,不同的例外处理策略,关键性应用(处理所有例外),实验软件(可以忽略许多例外),处理例外时的注意事项,终止程序会导致资源泄漏,利用例外处理释放资源,尽可能近地处理例外,这样程序清晰易读,能在局部处理的错误不要使用例外机制,例外机制的处理比正常处理效率低,异常的概念,异常的概念,.,class ExcepTest,public void main(String args),int b=0;int a;,try a=5/b;,catch(ArithmeticException e),System.out.println(“divided by 0”);,try URL url=new,URL(http:/ e),badURL=true;repaint();,异常的分类,异常是一个对象,它继承自,Throwable,类,所有的,Throwable,类的子孙类所产生的对象都是例外,.,Error:,由,Java,虚拟机生成并抛出,Java,程序不做处理,.,Runtime Exception,(,被,0,除等系统错误,数组下标超范围,):,由系统检测,用户的,Java,程序可不做处理,系统将它们交给缺省的异常处理程序,.,Exception,(,程序中的问题,可预知的,):Java,编译器要求,Java,程序必须捕获或声明所有的非运行时异常,throw:,用户自己产生异常,异常的分类,异常的分类,.,Throwable,Error,Exception,RuntimeException,缺省的异常,处理程序,由用户捕获或,声明并处理,不做处理,用户自己产生的异常,要处理,例外的分类,一个例外是由一个对象来代表的,所有的例外都直接或间接地继承自,Throwable,类。,在,Java,类库的每个类包中都定义了例外类,这些例外类分成两大类:,Error,类及,Exception,类,后者是,Java,程序中需要大量处理的。,除了,Java,类库所定义的例外类之外,用户也可以通过继承已有的例外类来定义自己的例外类,并在程序中使用(利用,throw,产生,,throws,声明抛出,,catch,捕捉并处理)。,Error,:由,Java,虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,,Java,程序不做处理。,Runtime Exception,:,Java,虚拟机在运行时生成的例外,如被,0,除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响太大。因此由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。,Exception,:一般程序中可预知的问题,其产生的例外可能会带来意想不到的结果,因此,Java,编译器要求,Java,程序必须捕获或声明所有的非运行时异常。,例外的分类,public static void main(String args),try,testThrowable();,catch(,Throwable t,),System.err.println(,t.toString(),);,System.err.println(,t.getMessage(),);,System.err.println(,t.getLocalizedMessage(),);,t.printStackTrace();,static void testThrowable(),throws Throwable,throw new Throwable(,测试,Throwable,的用法。,);,java.lang.Throwable:,测试,Throwable,的用法。,测试,Throwable,的用法。,测试,Throwable,的用法。,java.lang.Throwable:,测试,Throwable,的用法。,at test.Untitled1.testThrowable(Untitled1.java:137),at test.Untitled1.main(Untitled1.java:79),public static void main(String args),try,testThrowable();,catch(Throwable t),System.err.println(,t.toString(),);,System.err.println(,t.getMessage(),);,System.err.println(,t.getLocalizedMessage(),);,t.printStackTrace(,System.err,);,static void testThrowable(),throws Throwable,throw new Throwable();,java.lang.Throwable,null,null,java.lang.Throwable,at test.Untitled1.testThrowable(Untitled1.java:137),at test.Untitled1.main(Untitled1.java:79),例外示例:,(,1,)编译时例外:在程序中必须对其进行处理,否则编译器会指出错误。,在使用能够产生异常的方法而没有捕获和处理,程序将不能通过编译,。,(,2,)运行时例外:程序中可以不做处理,直接由运行时系统来处理。,例外的分类,捕获异常,捕获并处理异常,try,/,接受监视的程序块,在此区域内发生,/,的异常,由,catch,中指定的程序处理,;,/,不能有其它语句分隔,catch,(,要处理的异常种类和标识符,),/,处理异常,;,catch,(,要处理的异常种类和标识符,),/,处理异常,;,捕获例外,try,语句,捕获例外的第一步就是用,try,语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。在执行过程中,该段代码可能会产生并抛弃一个或多个例外,因此,它后面的,catch,语句进行捕获时也要做相应的处理。,如果没有例外产生,所有的,catch,代码段都被略过不执行。,捕获例外,catch,语句,每个,try,语句必须伴随一个或多个,catch,语句,用于捕获,try,代码块所产生的例外并做相应的处理。,catch,语句有一个形式参数,用于指明其所能捕获得例外类型,运行时系统通过参数值把被抛弃的例外对象传递给,catch,语句。,程序设计中要根据具体的情况来选择,catch,语句的例外处理类型,一般应该按照,try,代码块中例外可能产生的顺序及其真正类型进行捕获和处理,尽量避免选择最一般的类型作为,catch,语句中指定要捕获的类型。,当然也可以用一个,catch,语句处理多个例外类型,这时它的例外类型应该是这多个例外类型的,父类,,但这种方式使得在程序中不能确切判断例外的具体类型。,catch(Exception e),捕获所有,Exception,catch(Throwable t),捕获,Exception,和,Error,例外总是由距离产生例外最近的匹配,catch,代码段处理,如果没有相应的例外处理,,则例外被交给上一层,try,代码段进行处理,例外处理的查找依据类型匹配原则顺序进行,第一个匹配的例外处理被执行,当例外处理执行完毕,程序接着最后一个,catch,代码段后的语句执行,例外处理的顺序影响到例外的处理,子类例外可被父类例外处理捕获,不要先捕获父类例外,再捕获子类例外,如果找不到相应的例外处理,非,GUI,程序将结束程序执行;,Applet,或,GUI,程序则回复到事件处理状态,捕获例外,catch,语句,捕获例外,catch,语句,尽量避免用一般类型作为,catch,中指定要捕获的类型。,一般应该按照,try,代码块中例外可能产生的顺序及其真正类型进行捕获和处理,,在例外处理中无法访问,try,代码段中声明的变量,因为此时,try,代码段已经退出了,例外处理所需要的任何信息一般都应该通过例外对象来传递,在使用方法时尽量直接处理该方法可能产生的例外,这样你的程序就会更健壮,在使用库方法之前,应该先仔细阅读说明文档,那里会介绍方法可能产生的例外以及例外产生的条件,在使用各种例外类之前也应该先仔细阅读说明文档,那里会介绍例外的具体含义及例外产生的条件,在,catch,代码段中产生的例外不是由相同,try,的后续,catch,代码段处理,而是由包含整个,try-catch,结构的上层,try,代码段检测并处理,可以把,catch,到的例外对象,再次抛出,,使上层,try-catch,结构继续处理该例外事件;也可以把例外对象转换为其它例外对象,catch(Exception e)throw e;,try-catch,机制不该被用于流程控制,例外情形应该是很稀少的,而不是经常性的,在,catch,代码段中的,return,语句用于退出方法
展开阅读全文