写在前面
前文说过静态数组常见的异常主要有两种,今天就这两种异常进行异常分析与处理。
异常分析
数组越界异常与空指针异常
数组越界异常
分析
下面是我在做项目时遇到的一个数组越界异常,现在就该异常进行分析与处理:
//函数栈信息是我通过log4j输出在了log文件中
[ERROR][2022-08-04 13:13:39][main:95] - [ERROR] 1
java.lang.ArrayIndexOutOfBoundsException: 1
at com.parse.xlsx.Excel.getSheetHeader(Excel.java:148)at com.parse.xlsx.Excel.getParsedSheetData(Excel.java:45)at com.parse.xlsx.Main.runTool(Main.java:46)at com.parse.xlsx.Main.main(Main.java:25) ArrayIndexOutOfBoundsException——数组越界异常类,其后的1代表数组下标1越界,之后的信息则是函数栈信息,指出了引用的位置。
处理
需要显示处理:
如果该数据之后的数据需要后续使用,通过函数栈位置确认位置,查看代码编写逻辑中是否缺乏对空数组情况的判定或一些生成数组的方法返回值的判断,例如String类的split方法通过分隔符将字符串分割成字符串数组,若分割符之后的数据都为空,则不计入数组(容易造成对生成的数组长度判断失误导致后续处理中数组越界问题的产生)。
无需处理,仅抛出:
例如本次项目中对excel解析时,会判断表头格式是否正确(表头存在空值则跳出sheet遍历后续的sheet),这时只要捕获取表头数据时数组越界异常便能达到想要的效果。
空指针异常
分析
java.lang.NullPointerException——空指针异常类
当定义了引用类型变量或初始化引用类型数组初始化时未赋值,便使用该变量或取数组数据便会抛出该异常(引用类型的初始化默认值为null)。
处理
添加null值判断或进行异常处理。
异常处理
常用处理方式
try-catch-finally
try-catch
try-finally
try-with-resources
throws
throw
try-catch-finally
对异常进行捕获且回收资源
try {
// 可能会发生异常的语句
} catch(ExceptionType e) {
// 捕获异常并对异常进行处理(打log或打印函数栈)
} finally {
// 清理代码块(需要显示关闭的资源,如数据库连接等)
}
try-catch
用于无需资源显示处理回收的代码
try {
// 可能会发生异常的语句
} catch(ExceptionType e) {
// 捕获异常并对异常进行处理(打log或打印函数栈)
}
try-finally
用于无论是否有异常都需对某些资源显示处理回收
try {
// 可能会发生异常的语句
} finally {
// 清理代码块(需要显示关闭的资源,如数据库连接等)
}
tip: finally代码块中的代码一定会被执行
try-with-resources
用于对资源进行自动回收
try(resources){
//TODO...
}
tip: resources中的资源必须实现AutoCloseable接口
throws
对方法体抛出异常
格式:
访问权限 [static] 返回值类型 funcname(params) throws ExceptionType{
//TODO...
}
throw
在程序中自行抛出异常
格式:
访问权限 [static] 返回值类型 funcname(params){
//TODO...
throw new ExceptionType(msg);
}
tip: throw 语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例