您现在的位置是:首页
>
24秒违例 创建自己的违例
创建自己的违例 并不一定非要使用Java违例 这一点必须掌握 因为经常都需要创建自己的违例 以便指出自己的库可能生成的一个特殊错误——但创建Java分级结构的时候 这个错误是无法预知的 为创建
创建自己的违例

并不一定非要使用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
很赞哦! (1056)