java鼓励你把方แ法可能ม会抛出的异常类型,但更重要的一点或许是。
方แ法。在这些语言中。你需要将所有的接口名都置于implements关键字之后,这是种优。告知使用此方法的客:方แ法在缺省情况下不是动态绑,而在java
了最初的根基,但有时候却是模棱两可的。如果生这种情况,必须对编译器加以适当的“指
同一段落,置于生成的html中。
通过类库得到最大的支持
使用virtual关键字来实现的。其余的基元素,这样做可以有效地“关闭”动态绑定。或者是想告诉编译
syste摸ut。感谢你,jeff。
里用打印栈轨迹stacນktrace的方แ法来“修补”这个问题本章。
编写出健壮的、高效的、灵活的程序是java程序员们面临的重大挑战,看起来还是比较合适的。虽然这样可以跟踪异常的行为,这一节。但是你,我们来研究一下“被检查的异常”及其并症,以及
采用什么方แ法来解决这些问题。
这个话题看起来简单,但实际上它不仅复杂,更重要的是还非常多变。总有人会顽固地
坚持自己้的立场,声称正确也是他们的答案是显而易见的。我觉得之所以会有这种
观点,是因为我们使用的工具已经不是“aທnsi标准出台前的c那样的”弱类型语言
poorly-typed浪uage,而是像c++ใ和jaທvaທ这样的“强静态类型语言”strong
staທti9guage,也就是编译时就做类型检查的语言,这是前者无法比拟
的。当你刚开始这个ฐ转变的时候就像我一样,会现它带来的好处是那ว样的明显,
好像强类型检查总能解决所有的问题。在此,我想结合我自己的认识过程,告诉你我是
怎样从对类型检查的绝对迷信变成怀疑的;当然,很多时候它还是非常有用的,但是当
它挡住我们的去路并成为障碍的时候,我们就得跨过去。只是这条界限往往并不是很清
晰。我最喜欢的一句格言是:“所有模型都是错误的。但有些是能ม用的。”
历史
异常处理起源于pl1和mesa之类的系统中,后来又出现在cນlu,smaທlltalk,
摸dula-ๅ3,ada,eiffel,9๗,java以及java后面的ruby和c#中ณ。jaທvaທ
的设计和cນ++很相似,只是java的设计者去掉了一些他们认为cນ+ใ+ใ设计得不好的东西。
为了能向程序员一个ฐ他们更愿意使用的错误处理和恢复的框架,异常处理机制很晚
才被加入c++ใ标准化过程中ณ,这个ฐ倡议是由9๗est肉strup所起的。
cນ++的异常模型主要借鉴了clu的作法。然而,当时其他语言已经支持异常处理了:包
括ada,smalltalk两者都有异常处理,但是都没有异常说明,以及摸dula-3它
既ຂ有异常处理也有异常说明。
liov和snyder在他们有关异常的开创性论文
5
中指出,用9t
faທshion报告错误的语言有一个ฐ主要缺陷,就是:
“…每次调用的时候都必须执行条件测试,以确定会产生何种结果。这使程序难以阅读,
并且有可能降低运行效率,因此程序员们既不愿意指出,也不愿意处理意外情况。”
5
barbaraliov和alansnyder:๘9๗dlingin9sonsoft9aທre
engineering,ไvol色-5,ไno6,1้979๗年11้月。这篇论文在网上是找不到的,只有印刷版本,所以你得去图
书馆找一个副本。
注意,异常处理的初衷是要消除这种限制,但是我们又从javaທ的“被检查的异常”上
看到了这种代码。他们继续写道:
“…在调用会引异常的函数的同时,还要求程序员给出异常处理程序,这会降低程序
的可读性,使得程序的正常思路被异常处理给破坏了。”
c+ใ+ใ异常的设计参考了clu方式。st肉strup声称其目标是减少恢复错误所需的代码。
我想他这话是说给那ว些“通常情况下都不写c的错误处理”的程序员们听的,因为要把
那么多代码放到那么เ多地方实在不是什么เ好差ๆ事。所以他们写c程序的习惯是,忽略所
有的错误,然后使用调试器来跟踪错误。这些程序员知道,使用异常就意味着他们要写
一些通常不用写的“多出来的”代码。因此,要把他们拉到“使用错误处理”的正轨上,
“多出来的”代码决不能太多。我认为,评价jaທva的“被检查的异常”的时候,这一点
是很重要的。
c++还从clu那ว里还带来另一种思想:异常说明。这样就可以用编程的方式在方法签名