第10章异常处理_第1页
第10章异常处理_第2页
第10章异常处理_第3页
第10章异常处理_第4页
第10章异常处理_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第 10 章章 异常异常210.1 异常处理的概念异常处理的概念n什么是异常什么是异常? 异常实际上是程序中错误导致中断了正异常实际上是程序中错误导致中断了正常的指令流的一种事件常的指令流的一种事件.n没有处理错误的程序没有处理错误的程序: read-file read-file openTheFile; openTheFile; determine its size; determine its size; allocate that much memory; allocate that much memory; closeTheFile; closeTheFile; nJava中的异常中

2、的异常(Exception)是一个定义是一个定义非正非正常情况常情况或或错误错误的的对象对象, 由程序或运行时环境由程序或运行时环境(产生产生)抛出抛出, 可以根据需要进行相应的捕捉可以根据需要进行相应的捕捉和处理。和处理。nJava预定义了一组程序执行中可能发生的预定义了一组程序执行中可能发生的异常和错误。异常和错误。 被被0除错误除错误 数组越界数组越界 空引用空引用 找不到指定文件找不到指定文件310.2 未捕捉得异常未捕捉得异常n如果异罕未得到处理,那么程序将异罕终如果异罕未得到处理,那么程序将异罕终止,同时生成一条描述该异常及异常出现止,同时生成一条描述该异常及异常出现位置的信息,与

3、该异常相关联的信息对于位置的信息,与该异常相关联的信息对于找到问题的出处来说至关重要。找到问题的出处来说至关重要。n例如,对于例如,对于CmdCalc.java输入数据错误输入数据错误n异常抛出时打印的信息其实是方法调用的异常抛出时打印的信息其实是方法调用的栈轨迹。栈轨迹。n异常类的相关方法:异常类的相关方法:getMessageprintStackTrace4510.3 异常的处理异常的处理-try-catch语句语句n以常规方法处理错误以常规方法处理错误 openFiles;openFiles; if (theFilesOpen) if (theFilesOpen) determine t

4、he lenth of the file; determine the lenth of the file; if (gotTheFileLength) if (gotTheFileLength) allocate that much memory; allocate that much memory; if (gotEnoughMemory) if (gotEnoughMemory) read the file into memory; read the file into memory; if (readFailed) errorCode=-1; if (readFailed) error

5、Code=-1; else errorCode=-2; else errorCode=-2; else errorCode=-3; else errorCode=-3; else errorCode=-4 ; else errorCode=-4 ; else errorCode=-5; else errorCode=-5; 6n观察前面的程序你会发现大部分精力花在观察前面的程序你会发现大部分精力花在出错处理上了出错处理上了.n只把能够想到的错误考虑到只把能够想到的错误考虑到,对以外的情况对以外的情况无法处理无法处理n程序可读性差程序可读性差n出错返回信息量太少出错返回信息量太少10.3 异常的

6、处理异常的处理-try-catch语句语句710.3 异常的处理异常的处理-try-catch语句语句n用异常的形式处理错误用异常的形式处理错误- try catchread-File;read-File; try try openTheFile;openTheFile; determine its size; determine its size; allocate that much memory; allocate that much memory; closeTheFile closeTheFile; catch(fileopenFailed) dosomething; catch(f

7、ileopenFailed) dosomething; catch(sizeDetermineFailed) dosomething; catch(sizeDetermineFailed) dosomething; catch(memoryAllocateFailed) dosomething; catch(memoryAllocateFailed) dosomething; catch(readFailed) dosomething; catch(readFailed) dosomething; catch(fileCloseFailed) dosomething; catch(fileCl

8、oseFailed) dosomething; 810.3 异常的处理异常的处理-try-catch语句语句n和传统的方法比较异常的优点和传统的方法比较异常的优点:1.把错误代码从常规代码中分离出来把错误代码从常规代码中分离出来2. 把错误传播给调把错误传播给调 用堆栈用堆栈3. 按错误类型和按错误类型和 错误差别分组错误差别分组10. 系统提供了对于一些无法预测的错误的系统提供了对于一些无法预测的错误的捕获和处理捕获和处理5. 克服了传统方法的错误信息有限的问题克服了传统方法的错误信息有限的问题method1method2method3method4产生异常传 递处理异常910.3 捕获异常

9、捕获异常n捕获并处理异常捕获并处理异常try try / /接受监视的程序块接受监视的程序块, ,在此区域内发生在此区域内发生 /的异常的异常, ,由由catchcatch中指定的程序处理中指定的程序处理; ; catchcatch( (要处理的异常种类和标识符要处理的异常种类和标识符) ) / /处理异常处理异常; ; catchcatch( (要处理的异常种类和标识符要处理的异常种类和标识符) ) / /处理异常处理异常; ; n对于命令行计算器程序对于命令行计算器程序 CmdCalc.java ,应该考虑异常捕获与处理,以增加程序的应该考虑异常捕获与处理,以增加程序的健壮性。健壮性。n考

10、虑运算数合法性考虑运算数合法性n考虑被零除错误考虑被零除错误n例例 CmdCalcV2.java101110.3.1 finallyfinally子句子句l一定会执行的程序块一定会执行的程序块-finally-finally异常处理的统一出口异常处理的统一出口try try / /常规的代码常规的代码; ; catch()catch() / /处理异常处理异常 finally finally / /不论发生什么异常不论发生什么异常( (或者不发生任何异或者不发生任何异常常),),都要执行的部分都要执行的部分; ; 1210.3.1 finallyfinally子句子句nfinally在文件处理

11、时非常有用在文件处理时非常有用ntry n 对文件进行处理的程序对文件进行处理的程序;ncatch(IOException e) n /对文件异常进行处理对文件异常进行处理;nfinally n 不论是否发生异常不论是否发生异常,都关闭文件都关闭文件;nnfinally子句是可选的子句是可选的。try子句可以没有子句可以没有catch子句,此时也可以使用子句,此时也可以使用finally。1310.4 异常的传递异常的传递-声明异常声明异常n一个方法不处理它产生的异常一个方法不处理它产生的异常, ,则异常沿着调用层则异常沿着调用层次向上传递次向上传递, ,由调用它的方法来处理这些异常由调用它的

12、方法来处理这些异常, ,叫叫声明异常声明异常. .n例例 propagation.java ExceptionScope.java propagation.java ExceptionScope.java l声明异常的方法声明异常的方法l在产生异常的方法名后面加上要抛出在产生异常的方法名后面加上要抛出(throws)(throws)的的异常的列表异常的列表nvoid compute(int x)throws void compute(int x)throws ArithmeticException ArithmeticException nreturnType methodName(param

13、eterlist) returnType methodName(parameterlist) throwsthrows exceptionList exceptionList1410.4 异常的传递异常的传递-声明异常声明异常例例:若因若因某种原某种原因不想因不想在创建在创建URL的的方法中方法中处理异处理异常常public method1() int x; try x=System.in.read(); compute(x); catch(IOException ioe) System.out.println(“read error”); catch(ArithmeticException

14、e) System.out.println(“devided by 0”); public int compute(int x) throws ArithmeticException e return z=100/x;1510.4 异常的传递异常的传递- 声明异常声明异常method1computer异常异常抛出抛出处理处理1610.4 异常的传递异常的传递-声明异常声明异常例例:说出程序执行结果说出程序执行结果public class exception1 void Proc(int sel) throws ArithmeticException, ArrayIndexOutOfBounds

15、Exception System.out.println(“In Situation + sel ); if (sel=0) System.out.println(no Exception caught); return; else if(sel=1) int iArray=new int4; iArray10=3; 1710.4 异常的传递异常的传递- 声明异常声明异常public static void main(String args) try Proc(0); Proc(1); catch(ArrayIndexOutOfBoundsException e) System.out.pri

16、ntln(Catch+e); c:jview throwsExceptionc:jview throwsExceptionIn Situation 0In Situation 0no Exception caughtno Exception caughtIn Situation 1In Situation 1Catch Catch java.lang.ArrayIndexOutOfBoundsException:10java.lang.ArrayIndexOutOfBoundsException:101810.5 异常类层次结构异常类层次结构n.ThrowableErrorExceptionE

17、xceptionRunTimeException缺省的异常缺省的异常处理程序处理程序由用户捕获或由用户捕获或声明并处理声明并处理不做处理不做处理用户自己产生的异常用户自己产生的异常要处理要处理1910.5 异常类层次结构异常类层次结构n异常是一个对象异常是一个对象,它继承自它继承自Throwable类类,所有的所有的Throwable类的子孙类所产生的对象都是例外类的子孙类所产生的对象都是例外.nError:由由Java虚拟机生成并抛出虚拟机生成并抛出,Java程序不做程序不做处理处理.nRuntime Exception(被被0除等系统错误除等系统错误,数组下数组下标超范围标超范围):由系统

18、检测由系统检测, 用户的用户的Java 程序可不做程序可不做处理处理,系统将它们交给缺省的异常处理程序系统将它们交给缺省的异常处理程序.nException(程序中的问题程序中的问题,可预知的可预知的): Java编译编译器要求器要求Java程序必须捕获或声明所有的非运行程序必须捕获或声明所有的非运行时异常时异常nthrow:用户自己产生异常用户自己产生异常2010.5 异常类层次结构异常类层次结构n常见的异常常见的异常nArithmeticExceptionArithmeticExceptionnArrayIndexOutOfBandsExceptionArrayIndexOutOfBand

19、sExceptionnArrayStoreExceptionArrayStoreExceptionnIOExceptionIOExceptionnFileNotFoundExceptionFileNotFoundExceptionnNullPointerExceptionNullPointerExceptionnMalformedURLExceptionMalformedURLExceptionnNumberFormatExceptionNumberFormatExceptionnOutOfMemoryExceptionOutOfMemoryException如果在使用能够如果在使用能够产生异

20、常的方法产生异常的方法而没有捕获和处而没有捕获和处理,将不能通过理,将不能通过编译编译21n可以通过可以通过Exception类或者其任意子类来定类或者其任意子类来定义新的异常类义新的异常类-抛弃异常。即人为抛出,抛弃异常。即人为抛出,而非出错由系统产生。而非出错由系统产生。n用户定义的异常同样要用用户定义的异常同样要用try-catch捕获捕获,但但必须由用户自己抛出必须由用户自己抛出 :nthrow ThrowableObject;nthrow new ArithmeticException();n异常是一个类异常是一个类,用户定义的异常必须继承自用户定义的异常必须继承自Throwable

21、或或Exception类类,建议用建议用Exception类类.10.5.1 用户自定义异常用户自定义异常-抛出异常抛出异常2210.5.1 用户自定义异常用户自定义异常-抛出异常抛出异常n形如形如:nclass MyException extends Exceptionn.; n例例 CreatingExceptions.javan OutOfRangeException.javapublic class OutOfRangeException extends Exception OutOfRangeException (String message) super (message); n修

22、改:修改:ntry n int value = scan.nextInt();n if (value MAX)n throw problem;n catch (OutOfRangeException e) e.printStackTrace();n2310.5.2 可检测异常与不可检测异常可检测异常与不可检测异常n一个可检测异常必须通过方法捕获或者列一个可检测异常必须通过方法捕获或者列入用以抛出或传播异常的方法的入用以抛出或传播异常的方法的throws子子句。句。nJava中仅有的不可检测异常为中仅有的不可检测异常为RuntimeException类或其子类的对象类或其子类的对象.n其余所有异

23、常均被视为可检测异常其余所有异常均被视为可检测异常.2410.6 I/O流及其异常处理流及其异常处理n数据流:数据流:是指在计算机的输入输出之间运是指在计算机的输入输出之间运动的数据序列。动的数据序列。输入输出是相对程序来说的,程序扮演两个输入输出是相对程序来说的,程序扮演两个角色:源和目的。角色:源和目的。n输入流:输入流:代表从外设流入程序的数据序列代表从外设流入程序的数据序列n输出流:输出流:代表从程序流向外设的数据序列代表从程序流向外设的数据序列n字节流:字节流:在输入输出过程中以字节为单位在输入输出过程中以字节为单位n字符流:字符流:在输入输出过程中以字符为单位在输入输出过程中以字符

24、为单位n按照功能不同可以分为按照功能不同可以分为节点流节点流和和处理流处理流25261.1.标准输入标准输入 public static final InputStream inpublic static final InputStream in 使用使用read()read()和和skipskip(long nlong n)方法读取。方法读取。2.2.标准输出标准输出 public static final PrintStream outpublic static final PrintStream out 使用使用print()print()和和println()println()来输出。来输出。3.3.标准错误输出标准错误输出 pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论