目录

try{     //业务代码} catch(IOException ex){     //错误处理    } catch(Exception ex){     //错误处理代码}
复制代码

当try块代码出错时,系统生成一个异常对象,并将对象抛给运行环境,这个过程叫做抛出异常,运行环境接收到异常对象是,会寻找处理该异常对象的catch代码块,找到合适的catch块,就将对象给其处理,如果找不到,则运行环境终止,程序也将退出。

2.2 异常类继承体系

Java提供了丰富的异常类,这些异常类有严格的继承关系

 

从这个图可以看出异常主要分为两类,Error与Exception,Error错误一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误,这些错误无法恢复或不可能捕获,将导致应用程序崩溃,这些不需要我们去捕获。

在捕获异常时我们通常把Exception类放在最后,因为按照异常捕获的机制,从上至下判断该异常对象是否是catch中的异常类或其异常子类,一旦比较成功则用此catch进行处理。如果将Exception类放在前面,那么就会进行直接进入其中,因为Exception类是所有异常类的父类,那排在它后面的异常类将永远得不到执行的机会,这种机制我们称为先小后大

2.3 多异常捕获

Java 7 开始,一个catch块中可以捕获多种类型的异常:

复制代码
public static void main(String[] args) {     try {         Integer a = Integer.parseInt(args[0]);         Integer b = Integer.parseInt(args[1]);         Integer c = a / b;         System.out.println(c);      } catch (IndexOutOfBoundsException | NumberFormatException             | ArithmeticException ie) {         //异常变量默认final,不能重新赋值        ie = new ArithmeticException("text");      } catch (Exception ex) {      } }
复制代码

多个异常之间用竖线(|)隔开,并且异常变量默认final,不能重新赋值。

2.4 获取异常信息

异常捕获后我们想要查看异常信息,可以通过catch后的异常形参来获得,常用的方法如下:

  • getMessage():返回异常的详细描述字符串。

  • getStackTrace():返回异常跟踪栈信息。

  • printStackTrace():将异常跟踪栈信息按照标准格式输出。

  • printStackTrace(PrintStream p):将异常跟踪栈信息输出到指定输出流。

2.5 finally回收资源

在try里面打开的一些物理连接,需要显示的回收,但显然在try里面或者catch里面进行回收是不行的,try中一旦出现异常,回收可能不会执行到,而catch更不行,因为在没有异常时根本不会执行,于是异常处理机制提供了finally,finally块代码一定会被执行,即是try中执行了return语句也还是会执行。

复制代码
try{     //业务代码}catch(XXXException xx){     //异常处理}catch(XXXException xx){      }finally{     //资源回收}
复制代码

在异常处理中,try是必须的,没有try块,后面的catch和finally没有意义,catch和finally必须出现一个,finally块必须是最后。

如果try