第14章

承。其余的基元素都必须是接口。你需要将所有的接口名都置于implements关键字之后,

承。其余的基元素า都必须是接口。你需要将所有的接口名都置于implements关键字之后,

syste摸utprintln"ิerasingtriangle";

syste摸utprintln"erasingtriangle";

byteb;

bຘyteb;

什么เ样的类型,但有时候却是模棱两可的。如果生这种情况,必须ี对编译器加以适当的“指

什么样的类型,但有时候却是模棱两可的。如果生这种情况,必须对编译器加以适当的“指

通过类库得到最大的支持

通过类库得到最大的支持

了最初的根基。感谢你,jeff。

了最初的根基。感谢你,jeff。

异常说明使用了附加的关键字thro9๗s,后面接一个所有潜在异常类型的列表,所以方法

定义可能看起来像这样:

voidfthro9๗stoo逼g,toosmall,divzero{

要是你这么写:

voidf{

就表示此方แ法不会抛出任何异常除了从runtimeex9๗继承的异常,它们可以在

没有异常说明的情况下被抛出,我们将在后面进行讨论。

你的代码必须与异常说明保持一致。如果方法里的代码产生了异常却没有进行处理,编

译器会现这个问题并提醒你:要么处理这个异常,要么เ就在异常说明中表明此方法将

产生异常。通过这种自顶向下强制ๆ执行的异常说明机制,jaທva在编译期就可以保证相当

程度的异常一致性。

不过还是有个能“作弊”的地方:你可以声明方法将抛出异常,实际上却不抛出。编译

器相信了你的声明,并强制ๆ此方法的用户像真的抛出异常那样使用这个方法。这样做的

好处是,为异常先占了个位子,以后就可以抛出这种异常而不用修改已有的代码。在定

义抽像基类和接口时这种能力很重要,这样派生类或接口实现就能够抛出这些预先声明

的异常。

这种在编译期被强制检查的异常称为“被检查的异常”9。

捕获所有异常

你可以只写一个异常处理程序来捕获所有类型的异常。通过捕获异常类型的基类

ex9,就可以做到这一点事实上还有其它的基类,但ex9是同编程活动

相关的基类。:

9e{

systemerrprintln"9";

}

这将捕获所有异常,所以你最好把它放在处理程序列表的末尾,以防止它抢在其它处理

程序之前先把异常捕获了。

因为ex9是与编程有关的所有异常类的基类,所以它不会含有太多特定的信息,

不过你可以调用它从thro9abຘle继承的方法:

stringgetmessage

stringgetlocalizedmessage

用来获取详细信息,或用本地语言表示ิ的详细信息。

stringtostring

返回对thro9able的简单描述,要是有详细信息的话,也会把它包含在内。

voidprintstaທcktracນe

voidprintsta9tstream

voidprintsta9t9riter

打印thro9๗able和thro9abຘle的调用栈轨迹cນallstacktrace。调用栈显示了“把

你带到异常抛出地点”的方法调用序列。此方แ法第一个版本输出到标准输出流,对后两

个版本你可以选择要输出的流在第12๐章,你将学习这两ä种流的不同之处。

thro9ablefillinstacktrace

用于在thro9aທble对象的内部记录栈框架stackfraທme的当前状态。这在程序重新

抛出错误或异常很快就会讲到时很有用。

此外,你也可以使用thro9aທble从其基类obຘjecນt也是所有类的基类继承的方法。

对于异常来说,getclaທss也许是个ฐ很好用的方法,它将返回一个表示此对象类型的对

象。然后你可以使用getname方法查询这个class对象的名称。你还可以用这个

class对象做更多复杂的操作,不过对于异常处理而言,这已经足够了。