您现在的位置是:首页 >

24秒违例 创建自己的违例

火烧 2021-05-07 22:48:55 1056
创建自己的违例   并不一定非要使用Java违例 这一点必须掌握 因为经常都需要创建自己的违例 以便指出自己的库可能生成的一个特殊错误——但创建Java分级结构的时候 这个错误是无法预知的   为创建

创建自己的违例  

24秒违例 创建自己的违例
  并不一定非要使用Java违例 这一点必须掌握 因为经常都需要创建自己的违例 以便指出自己的库可能生成的一个特殊错误——但创建Java分级结构的时候 这个错误是无法预知的   为创建自己的违例类 必须从一个现有的违例类型继承——最好在含义上与新违例近似 继承一个违例相当简单     //: Inheriting java  // Inheriting your own exceptions    class MyException extends Exception {   public MyException() {}   public MyException(String msg) {    super(msg);   }  }    public class Inheriting {   public static void f() throws MyException {    System out println(      Throwing MyException from f() );    throw new MyException();   }   public static void g() throws MyException {    System out println(      Throwing MyException from g() );    throw new MyException( Originated in g() );   }   public static void main(String[] args) {    try {     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: )      at Inheriting main(Inheriting java: )  Throwing MyException from g()  MyException: Originated in g()      at Inheriting g(Inheriting java: )      at Inheriting main(Inheriting java: )    可以看到 在从f() 掷 出的MyException违例中 缺乏详细的消息   创建自己的违例时 还可以采取更多的操作 我们可添加额外的构建器及成员     //: Inheriting java  // Inheriting your own exceptions    class MyException extends Exception {   public MyException () {}   public MyException (String msg) {    super(msg);   }   public MyException (String msg int x) {    super(msg);    i = x;   }   public int val() { return i; }   private int i;  }    public class Inheriting {   public static void f() throws MyException {    System out println(      Throwing MyException from f() );    throw new MyException ();   }   public static void g() throws MyException {    System out println(      Throwing MyException from g() );    throw new MyException ( Originated in g() );   }   public static void h() throws MyException {    System out println(      Throwing MyException from h() );    throw new MyException (      Originated in h() );   }   public static void main(String[] args) {    try {     f();    } catch(MyException e) {     e printStackTrace();    }    try {     g();    } catch(MyException e) {     e printStackTrace();    }    try {     h();    } catch(MyException e) {     e printStackTrace();     System out println( e val() = + e val());    }   }  } ///:~    此时添加了一个数据成员i 同时添加了一个特殊的方法 用它读取那个值 也添加了一个额外的构建器 用它设置那个值 输出结果如下     Throwing MyException from f()  MyException       at Inheriting f(Inheriting java: )      at Inheriting main(Inheriting java: )  Throwing MyException from g()  MyException : Originated in g()      at Inheriting g(Inheriting java: )      at Inheriting main(Inheriting java: )  Throwing MyException from h()  MyException : Originated in h()      at Inheriting h(Inheriting java: )      at Inheriting main(Inheriting java: )  e val() =     由于违例不过是另一种形式的对象 所以可以继续这个进程 进一步增强违例类的能力 但要注意 对使用自己这个包的客户程序员来说 他们可能错过所有这些增强 因为他们可能只是简单地寻找准备生成的违例 除此以外不做任何事情——这是大多数Java库违例的标准用法 若出现这种情况 有可能创建一个新违例类型 其中几乎不包含任何代码   //: SimpleException java  class SimpleException extends Exception {  } ///:~  它要依赖编译器来创建默认构建器(会自动调用基础类的默认构建器) 当然 在这种情况下 我们不会得到一个SimpleException(String)构建器 但它实际上也不会经常用到 lishixinzhi/Article/program/Java/JSP/201311/19485  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码