大多数编程语言都有异常处理机制,无非就是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里面的代码总是会被执行。