java炒冷饭系列06 异常说明(throws)

来源:互联网 发布:决战武林法骑进阶数据 编辑:程序博客网 时间:2024/06/03 02:09

前言

java鼓励人们把方法可能会抛出的异常告知使用此方法的客户端程序员。这是种优雅的做法,它使得调用者能确切知道写什么样的代码可以捕获所有潜在的异常。

当然,如果提供了源代码,客户端程序员可以在源代码中查找throw语句来获知相关信息,然而程序库通常并不与源代码一起发布。为了预防这样的问题,java提供了相应的语法(并强制使用这个语法),使你能以礼貌的方式告知客户端程序员某个方法可能会抛出的异常类型,然后客户端程序员就可以进行相应的处理。

这就是异常说明,它属于方法声明的一部分,紧跟在形式参数列表之后。

异常说明使用了附加的关键字throws,后面接一个所有潜在异常类型的列表,所以方法定义可能看起来像这样:

void f() throws TooBig, TooSmall, DivZero{//...

但是,要是这样写:

void f(){//...

就表示此方法不会抛出任何异常(除了从RuntimeException继承的异常,它们可以在没有异常说明的情况下被抛出)
代码必须与异常说明保持一致。如果方法里的代码产生了异常却没有进行处理,编译器会发现这个问题并提醒你:要么处理这个异常,要么就在异常说明中表明此方法将产生异常。通过这种自顶向下强制执行的异常说明机制,java在编译时就可以保证一定水平的异常正确性。

不过还是有个能“作弊”的地方:可以声明方法将抛出异常,实际上却不抛出。编译器相信了这个声明,并强制此方法的用户像真的抛出异常那样使用这个方法。这样做的好处是,为异常先占个位子,以后就可以抛出这种异常而不用修改已有的代码。在定义抽象基类和接口时这种能力很重要,这样派生类或接口实现就能够抛出这些预先声明的异常。

这种在编译时被强制检查的异常称为被检查的异常

练习

定义一个类,令其方法抛出一个已检查异常。不用异常说明,看看能否通过编译。然后加上异常说明,用try-catch子句测试该类和异常

public class ExceptTest {    public void method(){        throw new Exception();    }}

上述代码抛出了一个已检查异常,介没有异常说明,所以编译会通不过,所以要改写成

public class ExceptTest {    public void method() throws Exception {        throw new  Exception();    }}

在调用上述定义的method()方法时要么继续抛出异常,要么用try-catch补获

class MethodInvoke{    public static void main(String[] args) {        ExceptTest et = new ExceptTest();        try {            et.method();        } catch (Exception e) {            e.printStackTrace();        }    }}
class MethodInvoke{    public static void main(String[] args) throws Exception {        ExceptTest et = new ExceptTest();        et.method();    }}

总结

理解异常说明的意义(理解其设计的意义是非学重要的)
理解异常说明的的用法

参考文献

《java编程思想》12.5异常说明

原创粉丝点击