在Java中对那些要调用方法的客户程序员我们要通知他们可能从自己的方法里掷出违例这是一种有礼貌的做法只有它才能使客户程序员准确地知道要编写什么代码来捕获所有潜在的违例当然若你同时提供了源码客户程序员甚至能全盘检查代码找出相应的throw语句但尽管如此通常并不随同源码提供库为解决这个问题Java提供了一种特殊的语法格式(并强迫我们采用)以便礼貌地告诉客户程序员该方法会掷出什么违例令对方方便地加以控制这便是我们在这里要讲述的违例规范它属于方法声明的一部分位于自变量(参数)列表的后面
违例规范采用了一个额外的关键字throws后面跟随全部潜在的违例类型因此我们的方法定义看起来应象下面这个样子
void f() throws tooBig tooSmall divZero { //
若使用下述代码
void f() [ //
它意味着不会从方法里掷出违例(除类型为RuntimeException的违例以外它可能从任何地方掷出——稍后还会详细讲述)
但不能完全依赖违例规范——假若方法造成了一个违例但没有对其进行控制编译器会侦测到这个情况并告诉我们必须控制违例或者指出应该从方法里掷出一个违例规范通过坚持从顶部到底部排列违例规范Java可在编译期保证违例的正确性(注释②)
②这是在C++违例控制基础上一个显着的进步后者除非到运行期否则不会捕获不符合违例规范的错误这使得C++的违例控制机制显得用处不大
我们在这个地方可采取欺骗手段要求掷出一个并没有发生的违例编译器能理解我们的要求并强迫使用这个方法的用户当作真的产生了那个违例处理在实际应用中可将其作为那个违例的一个占位符使用这样一来以后可以方便地产生实际的违例毋需修改现有的代码