1.什么是异常?
异常就是程序出现了问题,错误.
2.异常分类
①编译时异常:编译器在程序员编写代码时检测出来的代码问题,需要程序员自己修改
②运行时异常:编译通过,在程序运行时出错
3.异常体系结构
throwable:
①error:严重问题
②exception:
RuntimeException:运行时异常
!RuntimeException:编译时异常
4.异常产生原理
ps:java对异常默认的处理方式,是将问题抛给上一级.
在抛出异常之前,java会根据错误产生的异常类,创建出该类的实例(对象),底层通过throw关键字将异常抛出给上一级,不断向上抛出,直到抛给JVM虚拟机,虚拟机将错误原因和位置打印到控制台反映给我们.
5.异常处理
①程序可以自己处理的,使用try...catch自行处理后,不影响其他代码的运行
②程序本身处理不了的,通过throws声明出去.仅仅对方法进行声明,告诉调用者此方法存在异常.
声明异常throws:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须在有异常的方法上通过throws进行声明,让调用者去处理。如果跑出的异常对象是RuntimeException,则方法上无需throws声明.
关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
//格式: 修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
public class ThrowsDemo {
public static void main(String[] args) throws FileNotFoundException {
read("a.txt");
}
// 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
}
}
//throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开。
public class ThrowsDemo2 {
public static void main(String[] args) throws IOException {
read("a.txt");
}
public static void read(String path)throws FileNotFoundException, IOException {
if (!path.equals("a.txt")) {//如果不是 a.txt这个文件
// 我假设 如果不是 a.txt 认为 该文件不存在 是一个错误 也就是异常 throw
throw new FileNotFoundException("文件不存在");
}
if (!path.equals("b.txt")) {
throw new IOException();
}
}
}
6.异常注意事项
- 运行时异常被抛出可以不处理。即不捕获也不声明抛出。
- 如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。
- 父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
- 当多异常处理时,捕获处理,前边的类不能是后边类的父类
- 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
- 如果finally有return语句,永远返回finally中的结果,避免该情况.
注:
spring中默认的事务回滚是RuntimeException,若要将在所有异常进行回滚,需要在方法声明加上注解
@Transactional(rollbackFor={Exception.class}).