承。其余的基元素都必须是接口。你需要将所有的接口名都置于implements关键字之后,
承。其余的基元素า都必须是接口。你需要将所有的接口名都置于implements关键字之后,
syste摸utprintln"ิerasingtriangle";
syste摸utprintln"erasingtriangle";
byteb;
bຘyteb;
什么เ样的类型,但有时候却是模棱两可的。如果生这种情况,必须ี对编译器加以适当的“指
什么样的类型,但有时候却是模棱两可的。如果生这种情况,必须对编译器加以适当的“指
通过类库得到最大的支持
通过类库得到最大的支持
了最初的根基。感谢你,jeff。
了最初的根基。感谢你,jeff。
异常说明使用了附加的关键字thro9๗s,后面接一个所有潜在异常类型的列表,所以方法
定义可能看起来像这样:
voidfthro9๗stoo逼g,toosmall,divzero{
要是你这么写:
voidf{
就表示此方แ法不会抛出任何异常除了从runtimeex9๗继承的异常,它们可以在
没有异常说明的情况下被抛出,我们将在后面进行讨论。
你的代码必须与异常说明保持一致。如果方法里的代码产生了异常却没有进行处理,编
译器会现这个问题并提醒你:要么处理这个异常,要么เ就在异常说明中表明此方法将
产生异常。通过这种自顶向下强制ๆ执行的异常说明机制,jaທva在编译期就可以保证相当
程度的异常一致性。
不过还是有个能“作弊”的地方:你可以声明方法将抛出异常,实际上却不抛出。编译
器相信了你的声明,并强制ๆ此方法的用户像真的抛出异常那样使用这个方法。这样做的
好处是,为异常先占了个位子,以后就可以抛出这种异常而不用修改已有的代码。在定
义抽像基类和接口时这种能力很重要,这样派生类或接口实现就能够抛出这些预先声明
的异常。
这种在编译期被强制检查的异常称为“被检查的异常”9。
捕获所有异常
你可以只写一个异常处理程序来捕获所有类型的异常。通过捕获异常类型的基类
ex9,就可以做到这一点事实上还有其它的基类,但ex9是同编程活动
相关的基类。:
9e{
systemerrprintln"9";
}
这将捕获所有异常,所以你最好把它放在处理程序列表的末尾,以防止它抢在其它处理
程序之前先把异常捕获了。
因为ex9是与编程有关的所有异常类的基类,所以它不会含有太多特定的信息,
不过你可以调用它从thro9abຘle继承的方法:
stringgetmessage
stringgetlocalizedmessage
用来获取详细信息,或用本地语言表示ิ的详细信息。
stringtostring
返回对thro9able的简单描述,要是有详细信息的话,也会把它包含在内。
voidprintstaທcktracນe
voidprintsta9tstream
voidprintsta9t9riter
打印thro9๗able和thro9abຘle的调用栈轨迹cນallstacktrace。调用栈显示了“把
你带到异常抛出地点”的方法调用序列。此方แ法第一个版本输出到标准输出流,对后两
个版本你可以选择要输出的流在第12๐章,你将学习这两ä种流的不同之处。
thro9ablefillinstacktrace
用于在thro9aທble对象的内部记录栈框架stackfraທme的当前状态。这在程序重新
抛出错误或异常很快就会讲到时很有用。
此外,你也可以使用thro9aທble从其基类obຘjecນt也是所有类的基类继承的方法。
对于异常来说,getclaທss也许是个ฐ很好用的方法,它将返回一个表示此对象类型的对
象。然后你可以使用getname方法查询这个class对象的名称。你还可以用这个
class对象做更多复杂的操作,不过对于异常处理而言,这已经足够了。