- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[计算机]Java-Exception
Java Exceptions 什么是exception?“物理的”、“逻辑的”,“现 实的”,“虚拟的”… 如何处理exception?“抛出”(throw,throws),“扑获”(catch),“善后”(finally)... “物理”与“现实”的exception 能意外中断程序控制流的事件。 试图打开一个不存在的文件; 试图与一个有问题的网络端口建立连接 数组下标越界 除数为零 试图从一个已经关闭了的流读取数据 一种使应用程序控制流转向系统程序(相对而言)的意外事件 处理exception,就是使这种控制流的转向在应用程序内“受控”发生。(如同启用一方法) “原始”的办法 …; 产生a; x = b/a; // 可能出问题 变成: ... 产生a; if (a != 0) { x=b/a;} else {print “message” ; return;} 或者 ... 产生a; if (a != 0) { x=b/a;} else {return(-101) ;} 认识 “处理”之后,“意外”就不再发生 -- 控制流都是事先设计的。 两种最“通俗”的意外信息传递方式 一段相关文字: 用户知道发生情况了 一种返回码:让调用者知道发生了什么情况 当然也可能混合使用。 若意外情况种类很多,这两种方式都不理想 程序代码混乱 返回码的一致性在不同的软件包之间很难维持。 Java Exception Model是这两种做法的一种普化 将“现实的”exception分成两大类 Error. 指那些致命性的意外情况,例如JVM的内部错误,通常程序员无能为力处理。 Exception. 那些可能在应用程序中检测到,并得到适当处理的意外情况,称为“异常”。 RuntimeException checked exceptions 用对象来表达所有的意外情况, 显然是“一段异常信息”和“一个返回码”的普化. “逻辑的”exception:对象 Java决定用对象来表达所有的意外情况,显然是“一段异常信息”和“一个返回码”的普化。 将意外情况分为Error和Exception两个子类,它们的共同父类为Throwable (含一String) 用户自定义的意外情况也都必须是Throwable,即它的直接或间接子类。(习惯上, 人们常让它们直接extends Exception) 这样的”异常“也就不一定非是对应某种现实的意外情况,可以是“虚拟的”(尽管最好不用)。 关于Throwable类 java.lang.Throwable, Object的直接子类 构造函数 Throwable(); // 得到对象生成时方法调用栈的一个snapshot, 用于提供情况发生的线索 Throwable(String); // 用于提供一段关于异常的message 典型方法 getMessage(), printStackTrace(); 例子: 定义“异常”类 假定我们需要反映“属性不存在”的异常情况. public class NoSuchAttr extends Exception { public String attrName; public Object obj; NoSuchAttr(String name, Object nogood) { super(“No attribute named \”” + name + “\” found”); attrName = name; obj = nogood; } // 新添构造函数 } // 除了一段message, 可由getMessage()读出. 还有具体信息供进一步分析. 为什么需要自定义异常 直接用Java的Exception类在一些简单场合是可以的. 但自定义异常能够 表达更丰富的信息, 例如不仅一段human readable message, 还可有更丰富的含义. 提供更明确的指示. 不同的异常类型本身就表示着不同的含义. 在一个方法体中可能出现几种不同的异常, 若都用Exception表示, 对处理不方便. (见后面的例子) throw/catch, throws 将异常放在其发生的背景中考察,一般地,形象地看,它是在某处被“抛出”,然后在另一处被“接住”(“捕获”)。 main() - m1 - m2 - … - mi-1 - mi - … 事情发生在mi, 最后得到处理可能在m2 如果谁也不接,系统在main之外提供一个缺省catch, 例如打印出所抛出的异常类型和它出现位置。 在“传统的”做法中,“返回码”的层层回传就有这种效果。 throw和throws完成的异常上传机制 返回码回传是很麻烦的:
文档评论(0)