异常层次结构:
编译(checked)异常:指的是,代码在编译的时候,JVM就检查代码的正确性,从而抛出编译时就已能发现的异常
运行(unchecked)异常:指的是,代码在运行的过程中有可能抛出的异常,我们自定义异常时都是继承RuntimeException
自定义异常类:
都是继承RuntimeException的。之所以自定义业务异常,完全是为了起一个业务名字的异常类,抛开这一点,我们的程序中其实没必要自定义异常类的,就在代码有可能抛出异常的地方 new RuntimeException("我的业务异常描述信息");足够用!
通过以上图的示例会发现,当我们自己编写程序时,需要某种业务不合理时,就抛出异常,我们自定义的异常都是继承RuntimeException的,小示例:
public class A
{
/**
* 方法内部:当发现某种业务不符合我们的预期时,不捕获异常,手动抛出异常
*/
public static void a(){
throw new RuntimeException("a()方法内部:throw new RuntimeException!");
}
/**
* 方法内部:当发现某种业务不符合我们的预期时,捕获异常后可以再次抛出它
*/
public static void b(){
try{
int x= 1/0;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("zero 0");
}
}
/**
* 方法声明:运行时unchecked异常是可以不用捕获,不用声明的
*/
//public static void c() throws ArithmeticException {
public static void c() {
int x= 1/0; //此句导致异常java.lang.ArithmeticException
}
/**
* 方法声明:编译checked异常,如果方法体内没捕获,必须在声明方法时throws
*/
public static void d() throws ClassNotFoundException{
Class.forName("ddd");
}
public static void main(String[] args) {
//a();
//b();
//c();
try{
d();
}
catch(Exception e){}
}
}
异常运行机制:
异常概念:
Error:运行时系统错误,程序无法管,JVM虚拟机的事
Exception:自定义异常都是继承RuntimeException的,程序可以捕获和处理异常
try{}块:try块内有可能抛出异常,try内的return;是指退出try块
catch(Exception e){}块:捕获异常加以处理,可再次抛出异常,catch内的return;是指退出try块
finally{}块:一定会被执行的,finally内的return;是指从当前方法返回
链式异常:
链式异常:引起当前异常的背后异常
初始化:Throwable(String msg, Throwable causeExcp) //构造异常,背后异常是causeExcp
获取背后异常:getCause() //如果当前异常有背后异常就返回,没有背后异常就返回null
设置背后异常:initCause(Throwable causeExcp) //设置当前异常的背后异常为causeExcp
异常新特性:
JDK7新增异常特性:
资源自动释放:try(资源){}catch(E e){}
多重捕获:catch(MyExceptionx | MyExceptiony e){}
异常传递:
如果异常没捕获,则异常传至上层调用方法直至JVM虚拟机。JVM默认异常处理机制,就是打印出异常的堆栈追踪信息并停止程序。