异常的处理技巧.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
异常的处理技巧

1 异常层次需要考察的异常情况有:用户输入错误、设备错误、物理限制、程序错误,传统的返回错误码的方法并不能处理所有的情况。1.1 异常分类在Java程序中,异常对象都派生于Throwable。如果Java的内置异常不满足需求,则可以创建自定义异常。下图是基本的异常体系:Error类描述了Java运行时系统的内部错误和资源耗尽错误,此类错误不应由应用程序抛出。而Exception分两类,一类是因程序逻辑问题,导致系统出问题,此时就是Runtime异常,如数组越界、类型转换错误、访问空指针。而如果程序可以正常,但在遇到不同IO情况时,出问题导致,则属于IO异常,如打开格式错误的URL、在文件尾部读数据、加载不存在的类文件等。RuntimeException一定是程序写的有问题,是可以避免出现的。Java将Error和RuntimeException定义为未检查的异常。其他异常为已检查。编译器将检查代码是否为所有已检查异常提供异常处理器。1.2 异常声明方法应该在首部声明其所有可能抛出的异常,例如:public void lookup() throws XXException,YYException一个方法必须声明所有可能抛出的已检查异常,而未检查异常要么不可控,要么就应该避免发生。如果方法没有声明所有可能发生的已检查异常,编译器就会给出错误消息。当程序调用一个抛出已检查异常的方法、或程序自己会抛出异常时,有必要进行异常声明,对于Error和Runtime这些未检查异常,无人可以预料,因此不需要声明。1.3 自定义异常如果遇到标准异常不能说明的情况,则需要自定义异常。只需要继承自某个异常类,并定义两个构造函数即可。一个默认构造函数,一个带有描述信息的构造器。2 捕获异常异常的捕获需要周密的计划。如果异常没有被捕获,程序会终止,并会在控制台上输出异常信息。对UI程序,异常出现后会提示用户,用户可以继续返回到程序中。使用try块来捕获异常try{}catch(XXXException e){}catch(YYYException e){}如果try语句中的任何代码抛出一个在catch中指定的异常,则程序会跳过try语句中的其余代码转而执行catch子句中的代码。如果抛出的是不在catch中指定的异常,则程序立即返回到上层调用者。当捕获到异常后,一种方法是我们自己处理;另一种是不处理,交给调用者去处理,这样只需要声明异常即可。如果应该捕获那些知道如何处理的异常,而将不知道如何处理的异常传递给上层。将异常交给足以胜任的处理器,比压抑它好得多。2.1 捕获多个异常通过示例代码,可以捕获多个异常2.2 链式异常当捕获到异常后,我们可以改变其类型,并重新抛出。这样做可以隐藏底层异常的细节,保持异常解释的抽象性。为了获得真正的底层异常,可以用setCause()方法将底层异常包装到高层异常中,并在需要的时候用getCause()来获取。2.3 finally子句不论异常是否发生,finally中的语句都会被执行,这可以作为一种比较合适的清理资源的方式。当然如果在finally中抛出异常,则会导致try中异常类型丢失。因此建议异常的使用风格如下:try{? ? try????{????}? ? finally? ? {????????}}catch(){}内层的try..finally负责清理资源,而外层的try只负责报告错误。2.4 堆栈跟踪java.lang.ThrowableThrowable(String s)Throwable(Throwable cause)?Throwable(String s,Throwable cause) ?用给定的cause构造一个异常ThrowablegetCause()voidsetCause()String getMessage() 获得描述信息StackTraceElement[] ?getStackTrace() 获取构造这个对象时调用堆栈的跟踪java.lang.ExceptionException(Throwable cause)?Exception(String s,Throwable cause) ?用给定的cause构造一个异常java.lang.RuntimeExceptionRuntimeException(Throwable cause)?RuntimeException(String s,Throwable cause) ?用给定的cause构造一个异常java.lang.StackTraceElementString getFileName() 返回元素运行时对应的源文件名intgetLineNumber() ?返回元素运行时对应的源文件行数String getClassName()

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档