前言
在我们写代码的时候,经常会碰到异常,本篇文章浅谈异常的种类及处理机制
一、异常有哪些种类?
顶级异常:Throwable
子类异常:Error,如OutOfMemoryError(OOM,内存溢出);Exception(这是我们常见的)
而在Exception常见的子类有IOException,RuntimeException
RuntimeException常见的三大异常:
NullPointerException-空指针异常
ClassCastException-类型转换异常
IndexOutOfBoundsException-下标越界异常
下图便于理解,各异常的关系(只列举了部分,常用到的异常)
二、异常处理机制(谁使用谁处理)
1.当前方法声明抛出异常
代码如下(示例):
public class Demo01 {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("./test.java");
}
}
如上只是为了演示,不建议在main方法上抛出异常,在main方法上抛出异常,不便处理异常
2.使用try...catch代码块包裹此方法的调整代码
代码如下(示例):
public class Demo02 {
public static void main(String[] args){
try {
FileInputStream fis = new FileInputStream("./test.java");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
如上使用try...catch处理异常:alt+enter选择try/catch即可或选中代码ctrl+alt+t选择try/catch
另外try...catch有时还会搭配finally一起使用,即try...catch...finally,以后单独演示
总结
1.如果调用的方法抛出了"非RuntimeException异常",则必须处理,遵循一个原则:谁调用谁处理
2.出现异常必须处理,如果不处理,编译有错误,程序无法运行
3.在我们自己写的方法中,如果出现异常,一般的做法是将异常抛出,谁调用谁处理,如下演示
class Demo03 {
public void methodA() throws FileNotFoundException {
//将异常抛出
FileInputStream fis = new FileInputStream("./test.java");
}
public void methodB() throws FileNotFoundException {
//调用了A方法,但是A方法将异常抛出,没有处理
//所以调用A方法有异常存在
methodA();
}
public void methodC(){
try {
//由于B方法依然将异常抛出,所以调用B方法仍存在异常
//这里选择了处理异常
methodB();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void methodD(){
//由于C方法对异常进行了处理,所以调用C方法,不需要处理异常
methodC();
}
}