6.2 异常处理
什么是异常,异常就是程序执行出现错误,比如被除数是零,数组越界,空指针异常等等;JVM在解释执行java字节码程序时,如果程序出错,JVM会实例化出一个异常对象,如果程序中存在异常处理机制,执行异常处理机制的代码,程序继续执行;如果没有,程序打印异常对象,然后程序运行停止。java中的异常分为两类
- error 系统内部错误,资源耗尽比如栈溢出等等,程序员处理不了
- Exception 编程问题或者偶然的外在因素导致的一般性问题,比如空指针、文件路径不存在等等,这类异常程序员可以排查解决。Exception又分为两类异常,一类是运行时异常(RuntimeException),其他Exception统称为受检查异常。区别在于运行时异常可以不处理,编译器会忽略该异常,而受检查异常一经出现必须被java的异常处理机制也就是抓抛模型处理。
java异常处理机制:抓抛模型,抓指的是通过try-catch代码块抓住JVM抛出的异常对象,然后处理;抛指的是对于可能出现的异常或者必须处理的受检查异常在本方法中不处理,将异常跑出去,由方法的调用者处理。
// 抓模型
try{
可能出错的代码段
}catch(Exception e){
出现异常被捕获后执行的程序,没有出现异常不执行此段代码
}finally{
不管程序出没出错都要执行的程序
}
// 抓模型,不处理可能出现的异常,将异常跑出
public void test() throws Exception{
int i = 1 / 0;
}
需要补充的是,除了JVM在程序执行出错的时候会实例化出异常并将异常对象抛出,我们也可以手动抛出异常。
//需要注意,方法内部手动抛出的是受检查异常,因此必须处理,要不try-catch,要不throws抛出去,要不编译器编译不过去
public void test() throws IOException {
IOException e = new IOException();
throw e;
}
当然我们也可以定义自己的异常类,只需要继承Exception类及其子类即可,一般我们会继承RuntimeException,因为这是不受编译器检查,简化开发。
public class MyException extends RuntimeException{
private Interger id;
public MyException(String msg, int id){
super(msg);
this.id = id;
}
}