您好,欢迎访问三七文档
1.课程名称:第六讲异常处理2.知识点2.1课程说明这部分内容是Java程序设计语言的中的重点,在Java程序设计、JavaEE开发中异常处理都是不可缺少的部分。为了是构建健壮、可维护的软件需要又大量防御性代码的存在,这些代码不是用来完成主要的业务逻辑,而是用来处理软件系统中可能出现的形形色色的错误而编写的。2.2本次讲解知识点1、概述2、异常处理机制3、Java异常类4、用户定义异常5、异常处理规则3.具体内容3.1概述3.1.1Java异常处理机制的优点异常处理已经成为衡量一门语言是否成熟的标准之一,目前主流的编程语言如C++、C#、Ruby等,大都提供了异常处理机制。对于构造大型、健壮、可维护的应用而言,错误处理是整个应用需要考虑的重要方面。以前的错误处理方法,穷举所有错误情况,例如:if(用户输入包含出逗号之外的其他非数字字符){alert坐标只能是数值gotoretry}elseif(用户输入不包含逗号){alert坐标要用逗号分隔gotoretry}else{业务实现代码…}无法穷举所有的异常错误,异常的情况往往要多于考虑到的情况,总有“漏网之鱼”存在,程序不够健壮。错误处理代码和业务实现代码混杂,严重影响代码的可读性,增加代码的维护难度。手工构造防御性代码:packagecode.javaoop.exception;/***CreatedbyIntelliJIDEA.*User:wuyoubf*Date:11-11-13*Time:上午8:58*TochangethistemplateuseFile|Settings|FileTemplates.*/publicclassCar{publicstaticfinalintOK=1;publicstaticfinalintWRONG=2;publicintrun(){if(carTrouble()){returnOK;}else{returnWRONG;}}privatebooleancarTrouble(){returnfalse;}}packagecode.javaoop.exception;/***CreatedbyIntelliJIDEA.*User:wuyoubf*Date:11-11-13*Time:上午9:06*TochangethistemplateuseFile|Settings|FileTemplates.*/publicclassWorker{privateCarcar;publicstaticfinalintIN_TIME=1;publicstaticfinalintLATE=2;publicWorker(Carcar){this.car=car;}publicintgotWork(){if(car.run()==Car.OK){returnIN_TIME;}else{walk();returnLATE;}}publicvoidwalk(){}}Java异常处理的优点:把各种不同类型的异常进行分类,用Java类来表示异常情况,这种类被称为异常类。异常流程的代码和正常流程的代码分离,提高程序的可读性。可以灵活处理异常,如果当前方法有能力处理异常,就捕获并处理它,否则只需抛出异常。packagecode.javaoop.exception;/***CreatedbyIntelliJIDEA.*User:wuyoubf*Date:11-11-13*Time:上午9:25*TochangethistemplateuseFile|Settings|FileTemplates.*/publicclassCarWrongExceptionextendsException{publicCarWrongException(){}publicCarWrongException(Stringmsg){super(msg);}}packagecode.javaoop.exception;importjava.util.Date;/***CreatedbyIntelliJIDEA.*User:wuyoubf*Date:11-11-13*Time:上午9:31*TochangethistemplateuseFile|Settings|FileTemplates.*/publicclassLateExceptionextendsException{privateDatearriveTime;privateStringreason;publicLateException(DatearriveTime,Stringreason){this.arriveTime=arriveTime;this.reason=reason;}publicDategetArriveTime(){returnarriveTime;}publicStringgetReason(){returnreason;}}packagecode.javaoop.exception;/***CreatedbyIntelliJIDEA.*User:wuyoubf*Date:11-11-13*Time:上午9:33*TochangethistemplateuseFile|Settings|FileTemplates.*/publicclassCarTwo{publicvoidrun()throwsCarWrongException{if(carNotBrake()){thrownewCarWrongException(Cardonotbrake);}if(carNotStartup()){thrownewCarWrongException(Cardonotstartup);}}privatebooleancarNotStartup(){returnfalse;}privatebooleancarNotBrake(){returnfalse;}}packagecode.javaoop.exception;importnet.mindview.util.RandomGenerator;importjava.util.Date;/***CreatedbyIntelliJIDEA.*User:wuyoubf*Date:11-11-13*Time:上午9:40*TochangethistemplateuseFile|Settings|FileTemplates.*/publicclassWorkerTwo{privateCarTwocar;privateWorkerTwo(CarTwocar){this.car=car;}publicvoidgotoWork()throwsLateException{try{car.run();}catch(CarWrongExceptione){walk();Datedate=newDate(System.currentTimeMillis());Stringreason=e.getMessage();thrownewLateException(date,reason);}}publicvoidwalk(){}}3.1.2Java虚拟机的方法调用栈Java虚拟机用方法调用栈(methodinvocationstack)来跟踪每个线程中一系列的方法调用过程。该堆栈保存了每个调用方法的本地信息(比如方法的局部变量)。每个线程都有一个独立的方法调用栈。对于Java应用程序的主线程,堆栈底部是程序的入口方法main()。当一个新方法被调用是,Java虚拟机把描述该方法的栈结构置入栈顶,位于栈顶的方法为正在执行的方法。如果方法中代码块可能抛出异常,有如下两种处理办法:(1)在当前方法中通过try…catch语句捕获并处理异常。(2)在方法的声明处通过throws语句声明抛出异常。当一个方法正常执行完毕,Java虚拟机会从调用栈中弹出该方法的栈结构,然后继续处理前一个方法。3.2异常处理机制3.2.1使用try…catch捕获异常try{业务实现代码}catch(){alert输入不合法gotoretry}如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时环境,这个过程被称为抛出异常。当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块并把该异常对象交个该catch块处理,这个过程成为捕获异常。如果Java运行时环境找不到捕获异常的catch块,则运行时环境终止,Java程序也将退出。不管程序代码块是否处于try中,设置包括catch中,只要执行该代码块时出现了异常,系统都会生成一个异常对象。范例:ExceptionDemo01.javaStringinputStr=null;//br.readLine():每当在键盘上输入一行内容按回车,刚输入的内容将被br读取到。while((inputStr=br.readLine())!=null){try{//将用户输入的字符串以逗号(,)作为分隔符,分隔成2个字符串String[]posStrArr=inputStr.split(,);//将2个字符串转换成用户下棋的座标intxPos=Integer.parseInt(posStrArr[0]);intyPos=Integer.parseInt(posStrArr[1]);//把对应的数组元素赋为●。if(!gb.board[xPos-1][yPos-1].equals(╋)){System.out.println(您输入的座标点已有棋子了,请重新输入);continue;}gb.board[xPos-1][yPos-1]=●;}catch(Exceptione){System.out.println(您输入的座标不合法,请重新输入。下棋座标应以x,y的格式);continue;}gb.printBoard();System.out.println(请输入您下棋的座标,应以x,y的格式:);}每个catch块都是专门用于处理该异常类及其子类的异常实例。当Java运行时环境接收到异常对后,会依次判断对象是否是catch块后异常类或其子类的实例,如果是,Java运行时环境将调用该catch块来处理该异常;否则再次拿该异常对象和下一个catch块里的异常类进行比较。try块后可以有多个catch块,try块后使用多个catch块是为了针对不同异常类提供不同的异常处理方式。当系统发生不同的意外情况时,系统会生成不同的异常对象,Java运行时环境就会根据异常对象所属的异常类来决定使用哪个catch块来处理异常。通常情况下,如果try块被执行一次,则try块后只有一个catch块会被执行,绝对不可能有多个catch块被执行。try块、catch块后面的{}不能省略。try块里面声明的变量是代码块内局部变量,它只在try块内有效,catch块中不能访问该变量。try{statement1;statement2;...}catch(ExceptionClass1e1){exceptionhandlerstatement1;…}catch(ExceptionClass2e2){exceptionhandlerstatement2;…}出现异常,系统生成异常对象exexinstanceofExceptionClass1==trueexinstanceofExceptionClass2==true进入catch后将不会向下进行3.2.2异常类的继承体系Java提供了丰富的异常类,这些异常类之间又严格的继承关系。ThrowableErrorExceptionRuntimeExceptionIOExceptionSQLException范例:ExceptionDemo02.javapublicclassExceptionDemo02{publicstaticvoidmain(String[]a
本文标题:第六讲异常处理
链接地址:https://www.777doc.com/doc-2161101 .html