一般情况下Java的违例实施方案都显得十分出色不幸的是它依然存在一个缺点尽管违例指出程序里存在一个危机而且绝不应忽略但一个违例仍有可能简单地丢失在采用finally从句的一种特殊配置下便有可能发生这种情况 //: LostMessagejava // How an exception can be lost class VeryImportantException extends Exception { public String toString() { return A very important exception!; } } class HoHumException extends Exception { public String toString() { return A trivial exception; } } public class LostMessage { void f() throws VeryImportantException { throw new VeryImportantException(); } void dispose() throws HoHumException { throw new HoHumException(); } public static void main(String[] args) throws Exception { LostMessage lm = new LostMessage(); try { lmf(); } finally { lmdispose(); } } } ///:~ 输出如下 A trivial exception at LostMessagedispose(LostMessagejava:) at LostMessagemain(LostMessagejava:) 可以看到这里不存在VeryImportantException(非常重要的违例)的迹象它只是简单地被finally从句中的HoHumException代替了 这是一项相当严重的缺陷因为它意味着一个违例可能完全丢失而且就象前例演示的那样这种丢失显得非常自然很难被人查出蛛丝马迹而与此相反C++里如果第二个违例在第一个违例得到控制前产生就会被当作一个严重的编程错误处理或许Java以后的版本会纠正这个问题(上述结果是用Java 生成的) |