一、异常分类
如上图所所示:所有的异常对象都是继承于Throwable类,Throwable类派生出Error和Exception两大类。
Error类主要描述Java运行时系统的内部错误和资源耗尽错误。这种错误一般会阻断程序的运行。
Exception异常:主要分为RuntimeException和其他异常。
RuntimeException主要包括:错误的强制转换类型ClassCastException、数组访问越界IndexOutOfBoundsException、空指针异常NullPointerException等常见异常。其他的异常包括:试图打开不存在的文件FileNotFoundException,类不存在ClassNotFoundException等异常。
我们在开发过程中需要对RuntimeException进行处理。
二、异常处理
1、声明检查异常:throws RuntimeException,把异常抛到上一层级进行处理。
2、异常捕获处理:try/catch/finally进行处理。
try代码块:正常执行的业务逻辑,可能会出现异常的代码块。注:只发发生异常就不会再执行后续的代码。
catch代码块:捕获的异常类型,可声明多个catch代码块,进行不同的异常捕获处理,同时也可以在catch块中抛出异常。注:只有try代码块抛出了异常才会执行catch代码块的内容。
在catch中捕获异常,并调用e.printStackTrace();方法会显示堆栈轨迹。
finally代码块:不管发没发生异常,最后总会处理执行finally代码块的代码。所以一般在finally块里面会执行:I/O流的关闭,数据库链接的关闭,锁的释放等释放资源的操作。
注:spring的事务@Transaction与try/catch之间的冲突:如果方法上标注了使用事务,但是在方法内部又使用了try/catch对代码异常进行了捕获,需要在catch方法内重新抛出异常,事务才能捕捉到异常,进行回滚操作。
三、断言
Java中 使用assert关键字来实现断言。
Java的断言就是一条assert 声明,其中包含了一个布尔表达式。断言可以被启用或者禁用,默认是禁用的。
断言被启用的情况下,执行到断言的声明,就会计算布尔表达式的值。如果表达式的值为false,那么就会抛出一个错误。
断言形式:assert Expression1 ; 或者 assert Expression1 : Expression2;
其中Expression1返回值必须是boolean或者Boolean类型,Expression2如果返回值是void就会编译报错。
四、日志
Java自带的日志级别:severe、Warning、info、config、fine、finer、finest。在开发中一般只关注前三个级别的日志。
常用的日志插件:slf4j、logback等。