第九章 异常机制
9.1 基本异常
异常情形指引发制止当前方法或者作用域继续执行的问题。
异常处理流程:当异常发生时java会使用new在堆上创建异常对象,然后从当前运行环境抛出异常对象的引用,执行异常处理。
所有的标准异常类均有两个构造器,一个是缺省构造器,一个是接受字符串为参数(异常信息)的构造器。
Throwable是根异常类
9.2 捕获异常
try{
... //可能出现异常的程序段,即被监视段
}
catch(Exception e){ //捕获特定的异常对象,执行相应的异常处理,System.err.print打印标准错误信息
e.printStackTrace(); //打印从方法调用处直到异常抛出处的方法调用序列
}
9.3 创建自定义的异常
例:
class MyException extends Exception{
public MyException(){};
public MyException(String msg){super(msg);}
public String getMessage(){ //覆盖Throwable.getMessage()方法
return super.getMessage();
}
}
9.4 异常说明
例:
void f() throws Toobig,Toosmall,...{}//异常说明即告诉编译器此方法可能出现的异常
9.5 捕获所有异常
try{
throw new Exception(“My Exception”);
}
Catch(Exception e){
System.err.print(e.getMessage()); //打印详细错误信息
System.err.print(e.getLocalizedMessage()); //打印详细错误信息
System.err.print(e.printStackTrace()); //打印调用栈轨迹
throw e.fillInStackTrace(); //抛出新异常,调用栈信息更新其返回的是Throwable引用则方法或者main中必须要有Throwable的异常说明。
}
垃圾回收器会清理异常对象
Throwable的子类只有Error(编译时和系统错误)、Exception(可抛出的异常)、RuntimeException(自动被java虚拟机抛出,不必在异常说明中,若没被捕获则在程序退出前调用printStackTrace())带有cause的构造器,如果把异常链接起来应使用initCause()方法
9.6 使用finally清理
finally{ //无论怎样均能执行
}
9.7 异常限制
当覆盖方法时,只能抛出基类方法的异常说明中的异常
9.8 异常匹配
异常处理系统会寻找最近的处理程序,派生类对象同样可以匹配基类