您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > 07JAVA编程基础7
java编程基础7-异常处理传统的编程语言中,程序员通过方法的特定返回值来表示异常情况,并且程序的正常流程和异常流程都采用同样的流程控制语句传统语言的异常处理机制的缺点:◦表示异常情况的能力有限,仅靠方法的返回值难以表达异常情况所包含的所有信息.◦异常流程的代码和正常流程的代码混合在一起,会影响程序的可读性,容易增加程序结构的复杂性.◦随着系统规模的不断扩大,这种处理方式己经成为创建大型可维护应用程序的障碍.Java异常处理机制◦把各种不同类型的异常情况进行分类,用Java类来表示异常情况,这种类被称为异常类。把异常情况表示成异常类,可以充分发挥类的可扩展和可重用的优势。◦异常流程的代码和正常流程的代码分离,提高了程序的可读性,简化了程序的结构。◦可以灵活的处理异常,如果当前方法有能力处理异常,就捕获并处理它,否则只需抛出异常,由方法调用者来处理它。publicvoidwork(){try{工作8个小时//可能会抛出DiseaseException异常下班回家}catch(DiseaseExceptione){去医院看病}}如果方法中的代码块可能抛出异常,有如下两种处理办法。(1)在当前方法中通过try...catch语句捕获并处理异常。(2)在方法的声明处通过throws语句声明抛出异常。在Java编程语言中,用try和catch语句来处理异常。格式如下:1.try{2.//codethatmightthrowaparticularexception3.}catch(SpecialExceptione){4.//codetoexecuteifaSpecialExceptionisthrown5.}catch(Exceptione){6.//codetoexecuteifageneralExceptionexceptionisthrown7.}intmethod1(intx)throwsException1,Exception2{if(x0)thrownewException1();if(x==0)thrownewException2();return++x;}voidmethod2(){Try{//以下代码可能抛出异常inta=method1(1);}catch(Exception1){//针对产生了Exception1的处理}catch(Exception2){//针对产生了Exception2的处理}}Java虚拟机用方法调用栈(methodinvocationstack)来跟踪每个线程中一系列方法调用过程,该堆栈保持了每个调用方法的本地信息(如方法的局部变量)。每个线程都有一个独立方法调用栈。对于Java应用程序的主线程,堆栈底部是程序的入口方法main()。当一个新方法被调用,Java虚拟机把描述该方法的栈结构置入栈顶,位于栈顶的方法为正在执行的方法。下面例题描述了方法调用栈的结构:publicclassMainCatcher{publicvoidmethodA(intmoney)throwsException{if(--money=0){thrownewSpecialException(Outofmoney);}System.out.println(methodA);}publicvoidmethodB(intmoney)throwsException{methodA(money);System.out.println(MethodB);}publicstaticvoidmain(String[]args)throwsException{newMainCatcher().methodB(1);}}main()methodB()methodA()方法调用堆栈当Java虚拟机追溯到栈底部的方法时,如果仍然没有找到处理该异常的代码块:◦1)调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息◦2)如果该线程不是主线程,那么终止这个线程,其他线程继续正常运行。如果该线程是主线程,那么整个应用程序被终止。main()method2()method1()方法调用堆栈当一个方法正常执行完毕,Java虚拟机会从调用栈中弹出该方法的栈结构,然后继续处理前一个方法。如果在执行方法的过程中抛出异常,则Java虚拟机必须找到能捕获该异常的catch代码块.它首先查看当前方法是否存在这样的catch代码块,如果存在,那么就执行该catch代码块;否则,Java虚拟机会从调用栈中弹出该方法的栈结构,继续到前一个方法中查找合适的catch代码块。如果Java虚拟机在某个方法中找到了处理该异常的代码块,则该方法的栈结构将成为栈顶元素,程序流程将转到该方法的异常处理代码部分继续执行。使用try..catch语句不会对应用的性能造成很大的影响。仅仅当异常发生时,Java虚拟机需要执行额外的操作,来定位处理异常的代码块,这时会对性能产生负面影响。如果抛出异常的代码块和捕获异常的代码块位于同一个方法中,这种影响就会小一些;如果Java虚拟机必须搜索方法调用栈来寻找异常处理代码块,对性能的影响就比较大了.尤其当异常处理代码块位于调用栈的底部时,Java虚拟机定位异常处理代码块就需要大量的工作。结论:◦1)不应该使用异常处理机制来控制程序的正常流程,而应该确保仅仅在程序中可能出现异常的地方使用try...catch语句;◦2)应该使异常处理代码块位于适当的层次.如果当前方法具备处理某种异常的能力,就尽量自行处理,不要把自己可以处理的异常推给方法调用者去处理。finally语句定义一个总是被执行的代码块,而不管有没有出现异常。publicvoidwork(){try{开门工作8个小时//可能会抛出DiseaseException异常}catch(DiseaseExceptione){去医院看病;}finally{关门}}publicvoidwork(){try{开门工作8个小时//可能会抛出DiseaseException异常关门}catch(DiseaseExceptione){去医院看病;}}finally语句定义一个总是被执行的代码块,而不考虑是否出现异常。publicclassFinallyTester{staticintmethod1(intx)throwsException{if(x0)thrownewException(x0);returnx++;}publicstaticvoidmain(Stringargs[]){try{System.out.println(method1(-1));System.out.println(end);}catch(Exceptione){System.out.println(Wrong);}finally{System.out.println(Finally);}把打印“finally”操作放在try…catch语句后面,也能保证这个操作被执行。publicclassFinallyTester{staticintmethod1(intx)throwsException{if(x0)thrownewException(x0);returnx++;}publicstaticvoidmain(Stringargs[]){try{System.out.println(method1(-1));System.out.println(end);}catch(Exceptione){System.out.println(Wrong);}System.out.println(Finally);}以上处理方式尽管某些情况下可行,但有缺点:◦1)把与try代码块相关的操作孤立开来,使程序结构松散,可读性差;◦2)影响程序的健壮性,如果catch代码块继续抛出异常,就不会执行打印”Finally”操作异常处理语句主要涉及到try,catch,finally,throw,和throws关键字,要正确使用它们,就必须遵守必要的语法规则.◦1)try代码块不能脱离catch代码块或finally代码块而单独存在.try代码块后面至少有一个catch代码块或finally代码块.◦2)try代码块后面可以有零个或多个catch代码块,还可以有零个或至多一个finally代码块。如果catch代码块和finally代码块并存,finally代码块必须在catch代码块后面。◦3)try代码块后面可以只跟finally代码块.4)在try代码块中定义的变量的作用域为try代码块,在catch代码块和finally代码块中不能访问该变量.5)当try代码块后面有多个catch代码块时,Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或其子类的实例,就执行这个catch代码块,而不会再执行其他的catch代码块。6)如果一个方法可能出现受检查异常,要么用try...catch语句捕获.要么用throws子句声明将它抛出,否则会导致编译错误。try{code1;//可能抛出各种异常}catch(SQLExceptione){System.out.println(SQLException);}catch(IOExceptione){System.out.println(IOException);}catch(Exceptione){System.out.println(Exception);}判断一个方法可能会出现异常的依据如下:◦方法中有throw语句;◦调用了其他方法,其他方法用throws子句声明抛出某种异常。例如method3()方法调用了method1()方法,method1()方法声明抛出IOExcption,因此在method3()方法中可能会出现IOException(7)throw语句后面不允许紧跟其他语句,因为这些语句永远不会被执行.publicvoidmethodA(intmoney)throwsException{try{if(--money=0){thrownewSpecialException(Outofmoney);System.out.println(methodA);}}catch(Exceptione){throwe;money=0;}}异常流程由try...catch...finally语句来控制。如果程序中还包含return和System.exit()句,就会使流程变得更加复杂—◦1)finally语句不被执行的惟一情况是先执行了用于终止程序的System.exit()方法。java.lang.System类的静态方法exit()用于终止当前的Java虚拟机进程,Java虚拟机所执行的Java程序也随之终止.publicstaticvoidmain(Stringargs[]){try{System.out.println(Begin);System.exit(0);}finally{System.out.println(Finally);}System.out.println(End);}异常流程由try...catch...finally语句来控制。如果程序中还包含return和System.exit()句,就会使流程变得更加复杂—◦2)return语句用于退出本方法.在执行try或catch代码块中的return语句时,假如有finally代码块,会先执行finally代码块。publicclassWithReturn{publicintmethodA(intmoney)throwsSpecialException{if(--money=0)thrownewSpecialException(Outofmoney);returnmoney;}publicintmethodB(intmoney){try{System.out.print
本文标题:07JAVA编程基础7
链接地址:https://www.777doc.com/doc-3052393 .html