本文共 1498 字,大约阅读时间需要 4 分钟。
本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第2章 ,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 罗得岛大学 新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
假定一个方法,它返回从磁盘读入的字符串。现在先不用担心这个方法如何完成这项任务,我们将在附录E中学习如何写这样的程序。不过,要知道从磁盘读入时可能会发生错误。这件事会产生一个IOException异常。因为IOException是受检异常,所以它必须被处理。我们可以在方法体内处理异常。但有时,程序员不能肯定异常发生时怎么做对客户是最好的。是应该终止执行,还是进行其他的处理更有意义?当不能肯定要采取哪个动作时,可以让方法的客户来处理异常。只要异常能在某个地方被处理了,你就不需要在方法内来处理它。
一个方法可能引起受检异常但又不处理它,就必须在方法头声明这件事。例如,如果方法readString抛出一个IOException异常但不处理它,则它的方法头应该是如下这样的:突出部分称为throws子句(throws clause)。它表明方法readString不用处理执行期间可能发生的IOException类型的异常。但如果另一个方法调用readString方法,则那个方法必须处理异常。调用方法可以自己处理IOException,也可以在它的方法头中包含一个throws子句告诉它的客户来处理异常。最终,每个抛出的受检异常都应该在程序的某个地方被处理。
你可以在throws子句中列出多个用逗号分开的受检异常。语法:throws子句
方法头可以含有一个throws子句,它列出该方法能抛出但不处理的异常。该子句的语法如下:
exception-list(异常列表)中的异常名用逗号分隔。它们的次序不重要。
注:如果方法可能抛出一个受检异常,或者在方法头写throws子句声明它,或者在方法内处理它;否则,会导致语法错误。
如果方法可能抛出未检异常,则可以在throws子句中声明它,或者处理它,但也可以什么都不做。
注:javadoc标签@throws
对于方法可能抛出的每个异常,在方法头之前的javadoc注释中,应该用单独的一行来说明。每个这样的行都要以标签@throws开头,并且它们应该按异常名的字典序排列。所有受检异常必须被说明。
运行时异常可以说明也可以不说明,且一般不说明。但是,设计人员可以说明客户或许很想处理的那些运行时异常。事实上,你会在Java类库中遇到一些被说明的运行时异常。但要知道,你使用的方法或许会导致一个未说明的运行时异常。如果你决定说明运行时异常,则它们不应该依赖于方法的定义方式。所以,标出方法可能抛出的异常,应该作为设计和规格说明的一部分,而不是实现的一部分。注:如果方法抛出一个异常但没有处理它,则方法结束执行
如果方法抛出一个异常但没有处理它,则方法的执行将结束。例如,如果前一个方法readString抛出一个IOException,则它的执行立即结束。但程序继续执行,异常传给readString的客户。
**程序设计技巧**:当定义一个可能抛出受检异常的方法时,如果不能提供对异常的合理反应,则要在方法头写一个throws子句将异常传给方法的客户。避免在throws子句中使用Exception,因为这样做,不会给其他程序员提供关于调用方法的任何有用信息。而是要尽量指明异常。
转载地址:http://qrmdl.baihongyu.com/