异常的分类

1、受检查的异常,(IOException,ClassNotFoundException,NoSuchMetodException)这类异常是必须显示地捕捉或抛出,如果显示地不捕捉或抛出通不过编译,这类异常是可以处理的异常,同时会强迫API的使用者捕获恢复异常或者声明异常继续向上抛出。

2、不受检查的异常,(Error和RuntimeException以及他们的子类)这类异常不必显示地捕捉和抛出,同时这类异常又分为两种,Error和运行时异常,导致这种异常出现的原因是由于执行了错误操作。其中 Error是java虚拟机层面的异常,虚拟机会终止线程,程序无法处理比如堆溢出,栈溢出运行时异常是程序员可以捕捉和抛出的比如除零,类型转换错误。

异常的处理

1、throws,throws是写在方法上面的,后面可以写多个异常类用逗号隔开即可,表示这个方法可能会出现这些异常,如果出现这些异常你就抛给方法的调用者我方法本身就不管了。如果父类的方法throws了一些异常,那么子类方法可以throws的异常是父类异常的子集(不是简单的数学上的集合关系,异常类本身也有继承关系这个也要考虑进去),不能抛出新的异常。

public void doSome() throws Exception{
        //....
}

2、throw,throw通常放在try-catch里面

try{
    //...
}catch(Exception e){
    //...
    System.out.println(e.getMessage()); //读出错误信息 throw new IOException("123"); 这里就会输出这个123
    System.out.println(e.toString()); //输出错误类型
    e.printStackTrace(); //指出异常类型,性质,栈层次已经在程序中出现的位置
    throw new Exception();
}

一旦执行到throw语句就表明确实发生了这个异常,但是我不恢复,并且把这个异常交给方法的调用者。

3、try-catch-finally,try-cache和上面两个的区别是try-catch是捕捉异常,throw和throws是抛出异常,就好比一个是甩锅者,一个是背锅者。关于这个finally有一些小知识点,finally一般是会必须执行的,但是有特殊情况,比如finally里面发生异常,在finally前面执行了System.exit()退出程序,程序所在的线程被杀死,CPU关闭。如果finally里面有return语句,try-catch里面也有的return的话,try-catch里面的return就别屏蔽了,只执行finally的return语句