论坛首页 Java企业应用论坛

Java异常与提高性能。

浏览 4502 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2013-12-17  
一直以来对于异常应不应该处理业务都分为两派,一种认为使用异常更oo,一种反对异常认为消耗性能。
其实这两种观点都存在误区,其实异常当然是为了提高性能而存在的,异常更不是为了oo而存在。

异常消耗性能是因为异常都是继承Throwable这个类,这个有个方法非常消耗性能。public synchronized native Throwable fillInStackTrace()

当然你可以通过覆盖这个方法,去掉同步和堆栈填充,把异常变成一个普通java类,从而提升性能。

    但是异常是不应该被用来做业务,即使通过改写也一样,同样需要创建一个实例,new一个实例同样是不小的开销,虚拟机还要对这个实例进行回收。如果异常情况频繁出现,同样会大量消耗系统资源。
    那么回到异常的本质,异常的本质当然是用来处理异常的(废话),异常字面意思就是系统运行正常的时候不应该出现的,如果出现了就被认为是异常。所以异常应该是很少出现的,反复经常出现的就不应该是异常,而是业务应该而且必须考虑的范围。
代码1:
if(isNumber(a))
{
//正常
}else
{
//异常
}
代码2:
try{
//正常
}catch(Exception e)
{
//异常
}
如果绝大数情况a都是数字,那么就没有必要对a是否数字进行判断。由于使用try-catch减少了if判断,提升了性能。
所以异常是为了提升性能的,不是用来消耗性能的。
   发表时间:2013-12-21  
楼主说的大部分赞同,但是“由于使用try-catch减少了if判断,提升了性能”不太赞同,个人认为宁愿多判断,也要减少异常发生,特别是在安全性和性能都要求较高的项目
0 请登录后投票
   发表时间:2013-12-23  
同意楼上的看法
0 请登录后投票
   发表时间:2013-12-23  
同意楼上的看法
0 请登录后投票
   发表时间:2013-12-24   最后修改:2013-12-24
看完了,只看到一句有用的。
public synchronized native Throwable fillInStackTrace() 耗性能.

synchronized:这个是耗资源,也可以说是耗性能! 就是队列的使用方式。
不过,程序中的异常,要么抛出,要么捕获处理,一般是不经常发送的情况,这里的性能问题可忽略;
当然,你如果把try catch当作if来使用,这是很糟糕的一种写法(想想一个循环吧)

是否捕获异常,就像1楼说的那个,按需捕获; 但是个人不建议自己手动捕获异常,如果遇到需要捕获异常,直接抛给框架处理就好了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics