捕捉异常
try{
//可能产生异常的代码
}catch(Type1 id1){
//处理Type1异常的代码
}catch(Type2 id2){
//处理Type2异常的代码
}catch(Type3 id3){
//处理Type3异常的代码
}
异常一旦发生,程序不一定要终止
抛出的子类异常会被父类的catch捕捉到
注意:图中所处二字指的是抛出异常所在的最近的大括号之间的区域。
捉到了做什么?
拿到异常对象之后,比如拿到了ArrayIndexOutOfBoundsException e
那么可以有:
System.out.println(e.getMessage());//e.getMessage()得到的是发生异常的时候放在e里的值
System.out.println(e);//打印出的是异常的名字和当时e里的值
e.printStackTrace();//打印出异常发生的位置和依照上图走的路线并且给出代码第几行
- 拿到异常对象之后
- String getMessage();
- String toString();
- void printStackTrace();
- 但是肯定回不去了,而具体的处理逻辑则取决于你的业务逻辑需要
再度抛出
调用这个代码即可:throw e;
可再次把这个异常抛出
其实在没有异常的时候也可以通过throw来抛出一个异常。
例如:
class OpenException extends Throwable{
}//代表目前可能会发生的异常
class CloseException extends Throwable{
}//代表现在不可能发生的异常,但是将来程序升级可能会抛出的异常
public static void readFile() throws OpenException, CloseException{//在这个位置把两个异常都写上
if(true)
throw new OpenException();//可以仅抛出一个异常
}
public static void main(String[] args){
try{
readFile();
}catch(OpenException e){//需要为现在的异常提供解决代码
}catch(CloseException e){//为了提前做好升级的准备
}
}
什么能仍?
- 任何继承了Throwable类的对象
- Exception类继承了Throwable
- throw new Exception(); //这个是Exception类的一个构造函数
- throw new Exception(“HELP”); //这个是Exception类的另一个构造函数
- //通常我们选择继承Exception类并且使用它的带参数的这个构造函数
万能的异常捕捉器
所有的系统运行异常都继承了Exception类,所以用catch(Exception e)即可捕捉到所有异常。
异常遇到继承
异常声明:
如果你调用一个声明会抛出异常的函数,那么你必须:
A、把函数的调用放在try块中,并且设置catch来捕捉所有可能抛出的异常
或:
B、声明自己会抛出无法处理的异常
异常声明遇到继承关系
当覆盖一个函数的时候,子类不能声明抛出比父类的版本更多的异常
在子类的构造函数中,必须声明父类可能抛出的全部异常