异常处理
异常:程序运行时所发生的非正常情况或错误
异常机制
JAVA中把异常当做对象来处理,并定义了一个基类Throwable作为所有异常的父类
Throwable类
Throwable类是Java 语言中所有错误或异常的超类,他有两个子类:Error与Exception
Error
表示恢复是很困难的一件事,他用来表示系统错误或者低层资源的错误
Exception
表示一种设计或实现问题。通常由一个程序员导致的错误
CheckedException
需要Try Catch显示的捕获,常见的 IOException
UncheckedException
又称RuntimeException,主要包括:
- NullPointerException
- IndexOutOfBoundException
- ClassCastException (类型强制转换异常)
- IllegalArgumentException (传递非法参数异常)
- ArrayStoreException (向数组中存放与声明类型不兼容对象异常)
异常捕获
对于try..catch捕获异常的形式来说,对于异常的捕获,可以有多个catch。
对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。如果有finally的话进入到finally里面继续执行。
换句话说,如果有匹配的catch,它就会忽略掉这个catch后面所有的catch。
异常捕获的顺序
catch()语句中异常捕获范围必须从小到大 一下例子无法编译通过:
import java.io.IOException;
public class ExceptionTryCatchTest {
public void doSomething() throws IOException{
System.out.println("do somthing");
}
public static void main(String[] args){
ExceptionTryCatchTest et = new ExceptionTryCatchTest();
try {
et.doSomething();
} catch (Exception e) {
//
} catch (IOException e) {
//
}
}
}
对我们这个方法来说,抛出的是IOException 当执行etct.doSomething();时,一但抛出IOException,它首先进入到catch (Exception e) {}里面,先和Exception匹配,所以后面的catch都不会执行了,所以catch (IOException e) {}永远都执行不到,就给我们报出了编译的错误:已捕捉到异常 java.io.IOException。