友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第125章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




    System。out。println(  

      〃Throwing MyException from g()〃);  

    throw new MyException(〃Originated in g()〃);  

  }  

  public static void main(String'' args) {  

    try {  



                                                                                        271 


…………………………………………………………Page 273……………………………………………………………

      f();  

    } catch(MyException e) {  

      e。printStackTrace();  

    }  

    try {  

      g();  

    } catch(MyException e) {  

      e。printStackTrace();  

    }  

  }  

} ///:~  

  

继承在创建新类时发生:  

  

class MyException extends Exception {  

  public MyException() {}  

  public MyException(String msg) {  

    super(msg);  

  }  

}  

  

这里的关键是“extends Exception”,它的意思是:除包括一个Exception 的全部含义以外,还有更多的含 

义。增加的代码数量非常少——实际只添加了两个构建器,对 MyException 的创建方式进行了定义。请记 

住,假如我们不明确调用一个基础类构建器,编译器会自动调用基础类默认构建器。在第二个构建器中,通 

过使用 super 关键字,明确调用了带有一个 String 参数的基础类构建器。  

该程序输出结果如下:  

  

Throwing MyException from f()  

MyException  

        at Inheriting。f(Inheriting。java:16)  

        at Inheriting。main(Inheriting。java:24)  

Throwing MyException from g()  

MyException: Originated in g()  

        at Inheriting。g(Inheriting。java:20)  

        at Inheriting。main(Inheriting。java:29)  

  

可以看到,在从f() “掷”出的MyException 违例中,缺乏详细的消息。  

创建自己的违例时,还可以采取更多的操作。我们可添加额外的构建器及成员:  

  

//: Inheriting2。java  

// Inheriting your own exceptions  

  

class MyException2 extends Exception {  

  public MyException2() {}  

  public MyException2(String msg) {  

    super(msg);  

  }  

  public MyException2(String msg; int x) {  

    super(msg);  

    i = x;  

  }  

  public int val() { return i; }  



                                                                                             272 


…………………………………………………………Page 274……………………………………………………………

  private int i;  

}  

  

public class Inheriting2 {  

  public static void f() throws MyException2 {  

    System。out。println(  

      〃Throwing MyException2 from f()〃);  

    throw new MyException2();  

  }  

  public static void g() throws MyException2 {  

    System。out。println(  

      〃Throwing MyException2 from g()〃);  

    throw new MyException2(〃Originated in g()〃);  

  }  

  public static void h() throws MyException2 {  

    System。out。println(  

      〃Throwing MyException2 from h()〃);  

    throw new MyException2(  

      〃Originated in h()〃; 47);  

  }  

  public static void main(String'' args) {  

    try {  

      f();  

    } catch(MyException2 e) {  

      e。printStackTrace();  

    }  

    try {  

      g();  

    } catch(MyException2 e) {  

      e。printStackTrace();  

    }  

    try {  

      h();  

    } catch(MyException2 e) {  

      e。printStackTrace();  

      System。out。println(〃e。val() = 〃 + e。val());  

    }  

  }  

} ///:~  

  

此时添加了一个数据成员 i;同时添加了一个特殊的方法,用它读取那个值;也添加了一个额外的构建器, 

用它设置那个值。输出结果如下:  

  

Throwing MyException2 from f()  

MyException2  

        at Inheriting2。f(Inheriting2。java:22)  

        at Inheriting2。main(Inheriting2。java:34)  

Throwing MyException2 from g()  

MyException2: Originated in g()  

        at Inheriting2。g(Inheriting2。java:26)  

        at Inheriting2。main(Inheriting2。java:39)  

Throwing MyException2 from h()  



                                                                                             273 


…………………………………………………………Page 275……………………………………………………………

MyException2: Originated in h()  

        at Inheriting2。h(Inheriting2。java:30)  

        at Inheriting2。main(Inheriting2。java:44)  

e。val() = 47  

  

由于违例不过是另一种形式的对象,所以可以继续这个进程,进一步增强违例类的能力。但要注意,对使用 

自己这个包的客户程序员来说,他们可能错过所有这些增强。因为他们可能只是简单地寻找准备生成的违 

例,除此以外不做任何事情——这是大多数 Java 库违例的标准用法。若出现这种情况,有可能创建一个新违 

例类型,其中几乎不包含任何代码:  

//: SimpleException。java  

class SimpleException extends Exception {  

} ///:~  

它要依赖编译器来创建默认构建器(会自动调用基础类的默认构建器)。当然,在这种情况下,我们不会得 

到一个SimpleException(String)构建器,但它实际上也不会经常用到。  



9。5 违例的限制  



覆盖一个方法时,只能产生已在方法的基础类版本中定义的违例。这是一个重要的限制,因为它意味着与基 

础类协同工作的代码也会自动应用于从基础类衍生的任何对象(当然,这属于基本的 OOP 概念),其中包括 

违例。  

下面这个例子演示了强加在违例身上的限制类型(在编译期):  

  

//: StormyInning。java  

// Overridden methods may throw only the   

// exceptions specified in their base…class   

// versions; or exceptions derived from the   

// base…class exceptions。  

  

class BaseballException extends Exception {}  

class Foul extends BaseballException {}  

class Strike extends BaseballException {}  

  

abstract class Inning {  

  Inning() throws BaseballException {}  

  void event () throws BaseballException {  

   // Doesn't actually have to throw anything  

  }  

  abstract void atBat() throws Strike; Foul;  

  void walk() {} // Throws nothing  

}  

  

class StormException extends Exception {}  

class RainedOut extends StormException {}  

class PopFoul extends Foul {}  

  

interface Storm {  

  void event() throws RainedOut;  

  void rainHard() throws RainedOut;  

}  

  

public class StormyInning extends Inning   

    implements Storm {  

  // OK to add new exceptions for constructors;  



                                                                                             274 


…………………………………………………………Page 276……………………………………………………………

  // but you must deal with the base constru
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!