分享
 
 
 

创建自己的违例

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

并不一定非要使用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: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; }

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()

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)构建器,但它实际上也不会经常用到。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有