一般情况下,java的违例实施方案都显得十分出色。不幸的是,它依然存在一个缺点。尽管违例指出程序里存在一个危机,而且绝不应忽略,但一个违例仍有可能简单地“丢失”。在采用finally从句的一种特殊配置下,便有可能发生这种情况:
//: lostmessage.java
// 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 {
lm.f();
} finally {
lm.dispose();
}
}
} ///:~
输出如下:
a trivial exception
at lostmessage.dispose(lostmessage.java:21)
at lostmessage.main(lostmessage.java:29)
可以看到,这里不存在veryimportantexception(非常重要的违例)的迹象,它只是简单地被finally从句中的hohumexception代替了。
这是一项相当严重的缺陷,因为它意味着一个违例可能完全丢失。而且就象前例演示的那样,这种丢失显得非常“自然”,很难被人查出蛛丝马迹。而与此相反,c++里如果第二个违例在第一个违例得到控制前产生,就会被当作一个严重的编程错误处理。或许java以后的版本会纠正这个问题(上述结果是用java 1.1生成的)。
闽公网安备 35060202000074号