30.JAVA编程思想——违例匹配
2016-04-19 21:50
288 查看
30.JAVA编程思想——违例匹配
“掷”出一个违例后,违例控制系统会按当初编写的顺序搜索“最接近”的控制器。一旦找到相符的控制器,就认为违例已得到控制,不再进行更多的搜索工作。
在违例和它的控制器之间,并不需要非常精确的匹配。一个衍生类对象可与基础类的一个控制器相配,如下
Annoyance extends Exception {
}
class
Sneeze extends Annoyance {
}
public
class Human {
public
staticvoidmain(String[]
args){
try {
throw
new Sneeze();
} catch (Sneeze
s) {
System.out.println("Caught Sneeze");
} catch (Annoyance
a) {
System.out.println("Caught Annoyance");
}
}
} /// :~
Sneeze 违例会被相符的第一个catch从句捕获。当然,这只是第一个。然而,假如我们删除第一个catch 从
句:
try {
throw new Sneeze();
} catch(Annoyance a) {
System.out.println("CaughtAnnoyance");
}
那么剩下的catch 从句依然能够工作,因为它捕获的是Sneeze 的基础类。换言之,catch(Annoyance e)能捕获一个Annoyance 以及从它衍生的任何类。这一点非常重要,因为一旦我们决定为一个方法添加更多的违例,而且它们都是从相同的基础类继承的,那么客户程序员的代码就不需要更改。至少能够假定它们捕获的是基础类。
若将基础类捕获从句置于第一位,试图“屏蔽”衍生类违例,就象下面这样:
try {
throw new Sneeze();
} catch(Annoyance a) {
System.out.println("CaughtAnnoyance");
} catch(Sneeze s) {
System.out.println("CaughtSneeze");
}
则编译器会产生一条出错消息,因为它发现永远不可能抵达Sneeze 捕获从句。
(1) 解决问题并再次调用造成违例的方法。
(2) 平息事态的发展,并在不重新尝试方法的前提下继续。
(3) 计算另一些结果,而不是希望方法产生的结果。
(4) 在当前环境中尽可能解决问题,以及将相同的违例重新“掷”出一个更高级的环境。
(5) 在当前环境中尽可能解决问题,以及将不同的违例重新“掷”出一个更高级的环境。
(6) 中止程序执行。
(7) 简化编码。若违例方案使事情变得更加复杂,那就会令人非常烦恼,不如不用。
(8) 使自己的库和程序变得更加安全。这既是一种“短期投资”(便于调试),也是一种“长期投资”(改
善应用程序的健壮性)
在Java 里,违例控制的目的是使用尽可能精简的代码创建大型、可靠的应用程序,同时排除程序里那些不能控制的错误。
违例的概念很难掌握。但只有很好地运用它,才可使自己的项目立即获得显著的收益。Java 强迫遵守违例所有方面的问题,所以无论库设计者还是客户程序员,都能够连续一致地使用它。
“掷”出一个违例后,违例控制系统会按当初编写的顺序搜索“最接近”的控制器。一旦找到相符的控制器,就认为违例已得到控制,不再进行更多的搜索工作。
在违例和它的控制器之间,并不需要非常精确的匹配。一个衍生类对象可与基础类的一个控制器相配,如下
1 代码
classAnnoyance extends Exception {
}
class
Sneeze extends Annoyance {
}
public
class Human {
public
staticvoidmain(String[]
args){
try {
throw
new Sneeze();
} catch (Sneeze
s) {
System.out.println("Caught Sneeze");
} catch (Annoyance
a) {
System.out.println("Caught Annoyance");
}
}
} /// :~
2 执行
CaughtSneezeSneeze 违例会被相符的第一个catch从句捕获。当然,这只是第一个。然而,假如我们删除第一个catch 从
句:
try {
throw new Sneeze();
} catch(Annoyance a) {
System.out.println("CaughtAnnoyance");
}
那么剩下的catch 从句依然能够工作,因为它捕获的是Sneeze 的基础类。换言之,catch(Annoyance e)能捕获一个Annoyance 以及从它衍生的任何类。这一点非常重要,因为一旦我们决定为一个方法添加更多的违例,而且它们都是从相同的基础类继承的,那么客户程序员的代码就不需要更改。至少能够假定它们捕获的是基础类。
若将基础类捕获从句置于第一位,试图“屏蔽”衍生类违例,就象下面这样:
try {
throw new Sneeze();
} catch(Annoyance a) {
System.out.println("CaughtAnnoyance");
} catch(Sneeze s) {
System.out.println("CaughtSneeze");
}
则编译器会产生一条出错消息,因为它发现永远不可能抵达Sneeze 捕获从句。
3 违例准则
用违例做下面这些事情:(1) 解决问题并再次调用造成违例的方法。
(2) 平息事态的发展,并在不重新尝试方法的前提下继续。
(3) 计算另一些结果,而不是希望方法产生的结果。
(4) 在当前环境中尽可能解决问题,以及将相同的违例重新“掷”出一个更高级的环境。
(5) 在当前环境中尽可能解决问题,以及将不同的违例重新“掷”出一个更高级的环境。
(6) 中止程序执行。
(7) 简化编码。若违例方案使事情变得更加复杂,那就会令人非常烦恼,不如不用。
(8) 使自己的库和程序变得更加安全。这既是一种“短期投资”(便于调试),也是一种“长期投资”(改
善应用程序的健壮性)
4 小结
通过先进的错误纠正与恢复机制,我们可以有效地增强代码的健壮程度。对我们编写的每个程序来说,错误恢复都属于一个基本的考虑目标。它在Java 中显得尤为重要,因为该语言的一个目标就是创建不同的程序组件,以便其他用户(客户程序员)使用。为构建一套健壮的系统,每个组件都必须非常健壮。在Java 里,违例控制的目的是使用尽可能精简的代码创建大型、可靠的应用程序,同时排除程序里那些不能控制的错误。
违例的概念很难掌握。但只有很好地运用它,才可使自己的项目立即获得显著的收益。Java 强迫遵守违例所有方面的问题,所以无论库设计者还是客户程序员,都能够连续一致地使用它。
相关文章推荐
- 29.JAVA编程思想——构建器
- 28.JAVA编程思想——用finally清除
- 轻量级java ee企业应用实战第4版 源码下载
- 学习javacv入门示例2:访问Mat元素,对图像加盐处理
- Java迭代器的一般用法
- JAVA的多态--多态中数据成员的问题
- JDK的下载安装以及配置过程
- 电脑配置 eclipse 环境变量
- Java基础-继承、抽象类、接口
- Spring注解@Resource和@Autowire的区别
- java的多态
- java.security.KeyException
- Spring 注解 @Resource和@Autowired
- Struts2中使用DMI(动态方法调用)
- spring websocket 项目搭建以及请求的基本过程
- Java多线程之synchronized和volatile的比较
- java中的匿名内部类总结
- eclipse插件本地扩展安装
- Spring的自动装配(byName;byType)
- java并发编程-Lock