Java中的异常处理
一、异常的层次结构
1、所有的异常都由Throwable继承而来,下一层分为两个分支,Error和Exception。
Error:是无法处理的异常,比如OutOfMemoryError,应用程序不应该试图处理此种类型的异常,如果出现了这样的异常,除了通告给用户,并尽力使程序安全终止之外,再也无能为力了。
Exception:是我们需要关注并可以处理的异常,其下由分为两个分支,RuntimeException和IOException(其他异常的统称)。由程序导致的错误属于RuntimeException,例如错误的类型转换、空指针访问、数组下标越界;IOException表示由资源或者输入不合法引起的异常,这种异常一般是可以预见并能够进行防范的,例如试图在文件尾部之后读取数据、打开错误格式的URL、访问不存在的文件等等
2、Java语言规范将派生于Error类或RuntimeException的所有异常称之为未检查异常(unchecked exception);而派生与IOExceptoin的异常称之为以检查异常(checked exception)。
对于unchecked exception异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。对于checked exceptionjava编译器强制程序员必须进行捕获处理,比如常见的IOExeption和SQLException。否则编译都不会通过。
3、处理异常的原则,如果本方法能够处理该异常,则在cache异常之后处理,否则通过throws语句把异常抛给调用方处理。
二、try catch finally的执行顺序
1、一般情况下:try----catch----finally
2、如果try中有return:try----finally----return
3、如果catch中有return:try----catch ----finally----return
在后两种情况下,reurn会被暂存在栈里面,等到finally执行完再返回。
这种机制保证无论出现什么情况,在try catch过程中finally都被执行一次,特别适合用于释放资源,例如释放数据库链接、释放打开的文件流等
下面看这一段代码,结果t会是神马东东?
public static final String test() { String t = ""; try { t = "try"; return t; } catch (Exception e) { t = "catch"; return t; } finally { t = "finally"; //return t; } }
上面我们讲到finally之前,return会被暂存到栈里面。上面代码里的t就会暂存起来,等到实际return的时候重新启用,所以上面的代码的正确返回值是"try"。
但是如果我们在finlly字句中添加了return,那么前面try子句中的t值就会被淹没,此时实际的返回值会是"finally"
三、try catch finally结构使用的建议
不建议在finally块中添加return,因为会消化掉try catch中的异常信息,不利于错误的正常处理,合理的return语句的位置:
1、return语句只在函数最后出现一次。
2、return语句仅在try和catch里面都出现。
3、return语句仅在try和函数的最后都出现。
4、return语句仅在catch和函数的最后都出现。
参考:
http://www.cnblogs.com/aigongsi/archive/2012/04/19/2457735.html
http://blog.csdn.net/hguisu/article/details/6155636(图片来源)