认识Java异常
throw(抛出)和throws(声明)的区别
throws一般用于检查型异常,就是编译时就有需要声明或者捕获的异常,表示此方法不处理异常,而交给方法调用处进行处理
throw一般用于运行时异常,继承于(RuntimeException),并且不需要throws Exception
异常大体分为两类
一类是RuntimeException,程序中完全可以避免的类似:数组越界异常,空指针异常
一类是非RuntimeException,是程序无法避免的,例如程序在读取文件,正好磁盘出现问题,就会引发IOException,这个靠完美代码无法解决的异常,需要我们告诉程序遇到这类问题后该怎么做
比如文件找不到、网络超时,则抛出编译时异常,否则比如磁盘满,抛运行时异常
1、Throw用于方法内部,Throws用于方法声明上
2、Throw后跟异常对象,Throws后跟异常类型
3、Throw后只能跟一个异常对象,Throws后可以一次声明多种异常类型
对异常处理的一些主观见解
处理异常
- 对于一些可预见的错误,如对象可能为空,可直接通过if判断,然后继续执行逻辑
- 对于不可预知的情况,如服务器冒烟了,打雷劈中机房了,需要使用try-catch来对异常进行处理
Spring中的异常事务
- 对于@Transactional可以保证RuntimeException错误的回滚,如果想保证非RuntimeException错误的回滚,需要加上rollbackFor = Exception.class 参数(这时,只要报错都会回滚)。
- 在1的前提下如果要在@Transactional注解的方法中使用try-catch,那么需要明确的抛出throw 异常,才能被Spring的事务所支持,且回滚
异常导致的问题
- throw或者throws异常会导致程序终止
- try-catch会捕获异常并且继续执行方法剩余的代码,也可以通过return终止方法