12.2 异常处理

异常有两种处理方式:
1.预先判断。
例如先排除除数为零的除法
if(b != 0)
    c=a/b;
当b不等于0的时候,做除法。另外还有一个就是判断对象不为空,如果是空的继续操作,就会出空指针异常。
如果异常可以这么处理,就这样做,这是比较简单的方式。但大部分的异常都无法这么处理,因为无法预料。

2.使用try……catch语法
假如没办法用上面的条件语句来筛掉错误的输入,例如网络超时的异常,那么只能用try……catch语法了
try{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
}
catch(ClassNotFoundException e){
    //写上异常该怎么处理
    e.printStackTrace();
}
catch(InstantiationException e){
    //写上异常该怎么处理
    e.printStackTrace();
}
catch(IllegalAccessException e){
    //写上异常该怎么处理
    e.printStackTrace();
}
异常实际上是一种类,在这里有三种异常。
第一个ClassNotFoundException,未找到class的异常;
第二个InstantiationException,初始化异常;
第三个IllegalAccessException,非法访问异常。
三个异常按照从上到下的顺序捕获。按上面的代码举例,发生异常,尝试catch第一个ClassNotFoundException,如果是就处理,不是就下一个catch,也就是InstantiationException,如果还不是,那么尝试InstantiationException,如果都没有,那么出现的异常不是这三种类型的,那么就会中止这个函数调用,由调用这个函数的函数来处理异常。
异常都是以Exception结尾,实际上Exception是所有异常的超类,也就是任何异常,都会是一种Exception异常。 上面的代码如果这样写:
try{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
}
catch(Exception e){
    //写上异常该怎么处理
    e.printStackTrace();
}
catch(InstantiationException e){
    //写上异常该怎么处理
    e.printStackTrace();
}
catch(IllegalAccessException e){
    //写上异常该怎么处理
    e.printStackTrace();
}
也就是第一个捕获的就是Exception异常,会导致后两个异常永远无法捕获,就好像这样的一个问句:
它是马?不是的话,它是白马?还不是的话,它是黑马?
后两个问句实际上是永远无法成立的。如果非要写Exception,那么它一定在最后的catch
try{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
}
catch(InstantiationException e){
    //写上异常该怎么处理
    e.printStackTrace();
}
catch(IllegalAccessException e){
    //写上异常该怎么处理
    e.printStackTrace();
}
catch(Exception e){
    //写上异常该怎么处理
    e.printStackTrace();
}
那里面的e又是什么呢?e只是一个异常对象,它只在catch这对大括号里生效,所以有3个e也没有冲突,e也有一些方法可以调用,printStackTrace()就是其中一个,这方法是在控制台打印异常信息!也就是我们在控制台看到的错误信息。
2.finally
这个语法结构,放在异常处理的最后,无论是否有异常产生,finally里面的语句都会被执行,如下所示:
try{
    System.out.println("你好!");
}
catch(Exception e){
    System.out.println("糟糕!");
}
finally{
    System.out.println("再见!");
}
或者是下面这种,已经出了异常:
try{
    System.out.println("你好!");
    int i=0;
    int k=i/i;
}
catch(Exception e){
    System.out.println("糟糕!");
}
finally{
    System.out.println("再见!");
}
“再见”都一定会打印