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(图片来源)

原文地址:https://www.cnblogs.com/mingziday/p/4614981.html