JAVA异常处理

159 阅读3分钟

大多数编程语言都有异常处理机制,无非就是try catch。我们都知道异常处理,都知道try catch,但具体到写代码的时候,却很少用它,或者说用得不是很规范。

    异常处理已经成为衡量一门语言是否成熟的标准之一,目前主流的编程语言如C++、java、python、php等都提供了异常处理机制。增加了异常处理机制后的程序拥有更好的容错性,更加健壮。

    对于一个程序设计人员,需要尽可能的预知所有可能发生的情况,尽可能的保证程序在所有糟糕的情形下都可以运行。比如设计一个计算器,就需要考虑到用户输入的被除数不能为0。但是每个人的能力都是有限的,很难保证考虑到所有的异常情况,没有人能保证自己写的程序永远不会出错,就算程序没有错,但是也无法保证用户会按照程序的设计输入理想的数据。

    这个时候异常处理就登场了,java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。当程序出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。

使用try catch捕获异常

try {
    //业务实现代码
} catch(Exception e){
   //异常处理、提示用户
}

如果执行到try快里面的业务逻辑代码出现异常,系统自动生成一个异常对象,该异常对象被提交给java运行时环境,这个过程被称为抛出异常。

异常类的继承体系

当java运行时环境接受到异常对象时,如何为该异常对象寻找catch快呢?

每个catch块都是专门用于处理该异常类及其子类的异常实例,当java运行时环境接收到异常对象后,会依次判断该异常对象是否是catch块后异常类及其子类的实例,如果是,java运行时环境将调用该catch块来处理该异常;否则与下一个catch块里的异常类进行比较。

java 7 提供的多异常捕获

在java7以前,每个catch块只能捕获一种类型的异常,从java 7开始,一个catch块可以捕获多种类型的异常。

  • 捕获多种类型的异常时,多种类型的异常之间用 | 隔开
  • 异常类型有隐式的final修饰,因此程序不能对异常变量重新复制

访问异常信息

如果程序需要在catch块中访问异常对象的信息,则可以通过访问catch块的后异常形参来获得。 下面是几个常用的方法

getMessage() //返回异常的详细信息
printStackTrace() //将异常跟踪栈信息输出到标注错误输出
printStackTrace(PrintStream s) //将异常跟踪信息输出到指定输出流
getStackTrace() //返回异常跟踪栈信息

使用finally回收资源

有些时候,程序在try块里面打开了一些物理资源,如数据库连接、磁盘文件等,这些资源都是需要回收的。

异常处理机制提供了finally块,不管try块里面的代码是否出现异常,也不管哪个catch块被执行,甚至try或catch中执行了return语句,finally里面的代码总是会被执行。