高效的Java异常处理 - 编程入门网
的人,也会很看重Java的数据类型。毕竟,编译器对数据类型施加的限制鼓励严格的编码和精确的思维。编译时的类型检查对减少运行时的严重问题有帮助。编译时的异常检查也能起到类似的作用,它会提醒开发人员某个方法可能会有预想不到的结果需要处理好。
早期的建议是尽可能的使用“检察的异常”,以此来最大限度的利用编译器提供的帮助来写出无错误的软件。Java类库API的设计者们都认同这一点,他们广泛地使用“检察的异常”来模拟类库方法中几乎所有的紧急应变措施。在J2SE5.1 API规格中,“检察的异常”类型已2比1的比率超过了“未检查的异常”类型。 对程序员而言,看上去在Java类库中大多数的常用方法对每一个可能的失败都声明了“检察的异常”。例如,java.io包 对IOException这个“检察的异常”就有着很大的依赖。至少有63个Java类库包,或直接,或通过十几个下面的子类,抛出这个异常。 I/O的失败极其稀有,但是却很严重。而且,一旦发生,从你所写的代码里基本上是无法补救的。Java程序员意识到他们不得不提供IOException或类似的不可补救的事件,而一个简单的Java类库方法的调用就可能让这些事件发生。捕获这些异常给本来简单的代码带来了一定的晦涩,因为即使在捕获的代码块里也基本上帮不上忙。但是不加以捕获又可能更糟糕,因为编译器要求你的方法必须要抛出那些异常。这样你的实施细则就不得不暴露在外了,而通常好的面向对象的设计都是要隐藏细节的。 这样一个不可能赢的局面导致了我们今天所警告的绝大多数臭名卓著的异常处理的颠覆性格局。同时也衍生了很多正确或错误的补救之道。 一些Java界的知名人物开始质疑Java的“检察的异常”的模型是否是一个失败的试验。有一些东西肯定是失败的,但是这和在Java语言里加入对异常的检查是毫无关联的。失败是由于在Java API的设计者们的思维里,大多数失败的情形是雷同的,所以可以通过同一种异常传达出去。 故障和应变 让我们来考虑在一个假想的银行应用中的CheckingAccount类。一个CheckingAcccount属于一个用户,记载着用户的存款余额,也能接受存款,接受止兑的通知,和处理汇入的支票。一个CheckingAcccount对象必须协调同步线程的访问,因为任何一个线程都可能改变它的状态。CheckingAcccount类里processCheck的方法会接受一个Check对象为参数,通常从帐户余额里减去支票的金额。但是一个管理支票清算的用户端程序调用processCheck方法时,必须有两种可能的应变措施。一,CheckingAccount对象里可能对该支票已有一个止付的命令;二,帐户的余额可能不足已满足支票的金额。 所以,processCheck的方法对来自客户端的调用可以有3种方式回应。正常的是处理好支票,并把方法签名里声明的结果返回给调用方。两种应变的回应则是需要与支票清算端沟通的在银行领域实实在在存在的情况。processCheck方法所有3种返回结果都是按照典型的银行支票帐户的行为而精心设计的。 在Java里,一个自然的方法来表示上述紧急的应变是定义两种异常,比如StopPaymentException(止付异常)和InsufficientFundsException(余额不足异常)。一个客户端如果忽略这些异常是不对的,因为这些异常在正常操作的情况下一定会被抛出。他们如同方法的签名一样反映了方法的全面行为。 客户端可以很容易的处理好这两种异常。如果对支票的兑付被停止了,客户端把该支票交付特别处理。如果是因为资金不足,用户端可以从用户的储蓄帐户里转移一些资金到支票帐户里,然后再试一次。 在使用CheckingAccount的API时,这些应变都是可以预计的和自然的结果。他们并不是意味着软件或运行环境的失败。这些异常和由于CheckingAccount类中一 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |