1.基本概念
异常处理步骤:
1.使用 new 在堆上创建异常对象;
2.终止当前执行路径,从当前环境弹出对异常对象的引用;
3.异常处理机制接管程序,执行异常处理程序。
抛出异常的方法:
throw new NullPointerExecption("t = null");
2.捕获异常
捕获异常方法
1.通过 try-catch 语法捕获异常;
2.catch 可以捕获具体的异常,也可以通过捕获 Exception 来捕获所有异常
try {
// 业务逻辑,可以抛出异常
} catch(NullPointerExecption e) { // 捕获空指针 NPE 异常
log.error("null pointer execption...", e);
} catch(Exception e) { // 可捕获所有异常
e.printStackTrace();
}
上面的程序通过 Throwable 类声明的 printStackTrace() 获取到了抛出异常处的方法调用堆栈信息并打印到控制台上。
异常匹配原则
1.抛出异常时,会按照顺序找到最近匹配该异常的处理程序进行处理;
2.不需要和异常处理程序声明的异常完全匹配,导出类的对象也可以匹配其基类的处理程序。
异常丢失
1.捕获异常后抛出另一个异常,会丢失原异常发生点的信息;
2.Error、Exception 以及 RuntimeException 异常可以把捕获的异常信息传入到构造器的 cause 对象,避免捕获异常信息丢失;
3.其他异常构造器入参没有 cause 对象,需要使用 initCause() 方法。
3.异常分类
Java 标准异常
Throwable 用来表示任何可以作为异常被抛出的类,可以分为两种类型:
- Error:表示编译时和系统错误;
- Exception:表示可以被抛出的基本类型。
自定义异常
class SimpleException extends Exception {}
public class InheritingExceptions {
public void f() throw SimpleException {
System.out.println("Throw SimpleException from f()");
throw new SimpleException();
}
}
public static void main(String[] args) {
InheritingExceptions ies = new InheritingExceptions();
try {
ies.f();
} catch(SimpleException e) {
e.printStackTrace();
}
}
4.异常的限制
1.当覆盖方法时,只能抛出在基类方法的异常说明里列出的那些异常;但是构造器不受该限制,可以抛出任何类型异常;
2.导出类构造器不能捕获基类构造器抛出的异常;
3.异常说明不属于方法类型的一部分,不能基于异常类型来重载方法。