理解java的异常

Posted on 2009-06-06 09:36 thui 阅读(281) 评论(0)  编辑  收藏 所属分类: java技术
java异常是很多程序员包括有些工作了很多年的程序员一直都没有搞清楚的问题,我也是如此,最近才算是彻底搞清楚,程序员关于java的异常的疑惑,主要集中在以下几个问题:
1.java异常的体系是怎样的?
2.Exception和运行时异常RuntimeException之间的联系和区别是什么?
3.finally块到底什么时候会执行?
4.开发者应该如果处理异常?
首先回答第一个问题:java异常的体系,最上面的基类是Throwable,Throwable的直接继承者有俩,一是Exception,二是Error,其中Error表示错误,比如链接错误等,这些是应用程序不能捕捉catch到的,不需要开发者关心,而Exception是应用程序自己能够捕捉到的,Exception又分为Exception和RuntimeException
再来回答第二个问题,Exception和RuntimeException有何区别?运行时异常顾名思义表示程序运行时才能检测到的异常,比如数组越界,空指针等,比如空指针,你写程序的时候你知道你的返回值会是空吗?你不知道,只有到了运行时才发现。所以它们被定义为运行时异常;相对的Exception为非运行时异常,我叫他们静态异常,就是说程序没有运行时就可以知道的异常,比如文件io、数据库连接异常等,有的同学可能会问,文件io这些个异常不是也要等到运行时才会发现吗?我当时也这样问过,呵呵,可以这样理解,比如就数据库连接异常而言,假如和数据库的网络断了,这时候不管你程序运行不运行,你都是连接不了数据库的,换句话说这些异常是天然存在的。不知道我这样解释明白不?
接着回答第三个问题,finally块到底何时会执行,答案是finally块会在try、catch返回前执行,举个例子:
try
{
dosomething();
}catch(Exception e)
{
dosomething1();
throw e;
}finally{
dosomething2();
return;
}
上面的代码中加入dosomething方法出异常了,那么首先会进入catch块,执行dosomething1方法,然后继续往下执行throw e的话就会出try catch块了,按照我们上面说的原则,此时不会执行throw e这一句了,而是直接进入finally块, 这是有两种情况了,如果finally块中没有返回,那么在执行完finally块后还是会继续回到throw e 执行,但是上面例子是情况2,在finally中就直接返回了。
最后一个问题,开发人员如何处理异常?java要求开发者要处理的上面提到的Exception=静态异常,在编码的时候就要显示的捕捉并处理。Exception的处理有几个原则要牢记:对异常的处理要尽可能的细分;数据库连接、文件IO等资源的回收要放在finally中进行;对异常要进行处理,打印信息或者其他,自己不能处理的异常要抛给上一层处理

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 11, comments - 8, trackbacks - 0, articles - 4

Copyright © thui