Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15504
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-25 10:41
文章分类

全部博文(9)

文章存档

2014年(1)

2013年(8)

我的朋友

分类: Java

2013-12-30 14:13:14

错误的开始
这一篇的中心思想很明确,所谓异常是用来处理预料之外的错误,不要用异常去处理意料之内的事情,比方说知道某段代码一定会出错,然后用try/catch括起来,等它出错,从而达到程序跳转,遍历数组,跳出循环等目的,像下面的代码是拙劣不可取的
  1. try {
  2.     int i = 0;
  3.     while(true) {
  4.         a[i++].f();
  5.     }
  6. }
  7. catch (ArrayIndexOutOfBoundException e) {
  8. }
应该转换成标准写法
  1. for (int i = 0; i < a.length; i++) {
  2.     a[i].f();
  3. }

错误的来源
上面的两种写法,孰优孰劣一目了然,但是为什么有人用第一种方法,目的是为了性能,但答案比非如此
方法二,每次对数组的访问,JVM都要判断越界情况,既然这样,就不要循环终止测试(i < a.length)
结果是错了,原因在于:
1. 创建,抛出和捕获异常的开销是非常昂贵
2. 把代码放在try/catch块中,阻止了现代JVM实现本来可能要执行的优化操作(例:JVM对数组遍历的优化)
实际上,在所有版本的JVM上,标准模式比基于异常的模式快的多

启示
不单单是条件控制,对于API的设计也应该遵循这条原则 - 一个良好的API不应该强迫它的客户为了正常的控制流而使用异常
例如:你设计了一个MethodA,你希望当满足某些条件的时候才能让客户调用MethodA,那么相对应的,你也应该设计出一个MethodB来表示是否获得了满足执行MethodA的条件,而不是让客户把MethodA丢进try/catch块,这种MethodB我们称为“状态测试”方法
在Java中,Iterator类就是一个很好的例子,next()方法就是MethodA,而对应的hasNext()就是MethodB,试想,如果没有hasNext()方法,那么next()方法势必放在try/catch中执行,这将是多么的糟糕!
阅读(386) | 评论(0) | 转发(0) |
0

上一篇:Error和Exception

下一篇:servlet基础

给主人留下些什么吧!~~