项目中很容易各种异常,对于这些异常情况有必要对原因进行总结分析,避免重复踩坑,提高编码的效率
常见运行期异常:
参照RuntimeException类的子类,NullPointerException(空指针),IndexOutOfBoundsException(数组越界)、IllegalArgumentException、ClassNotFoundException(类找不到异常)、
空指针异常:
NullPointerException extends RuntimeException属于运行期异常
通过查看java se手册看到产生的原因有哪些
当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
调用 null 对象的实例方法。
访问或修改 null 对象的字段。
将 null 作为一个数组,获得其长度。
将 null 作为一个数组,访问或修改其时间片。
将 null 作为 Throwable 值抛出。
应用程序应该抛出该类的实例,指示其他对 null 对象的非法使用。
例如:
这里没有通过new或者其他方式构建对象,此时调用这个对象的方法或做任何修改都会抛出空指针异常
当new了对象之后,即便List中没有值,循环也不会出现问题
对象的默认值为Null
这里需要增加判空的方法
空指针异常的情况:
注意 NPE 产生的场景:
1) 返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
反例:public int f() { return Integer 对象}, 如果为 null,自动解箱抛 NPE。
2) 数据库的查询结果可能为 null
3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
4) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。
5) 对于 Session 中获取的数据,建议进行 NPE 检查,避免空指针。
6) 级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。
IndexOutOfBoundsExcention(数组下标越界)
指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
异常捕获try代码块
try-catch-finally是处理程序异常的三部曲,当存在try时可以只存在catch,也可以只有finally代码块,就是不能只有try这个代码块(会编译错误)
try代码块:
监视程序执行,一旦发生异常则直接跳转至catch中,如果没有catch则直接跳到finally块中
finally块:
不管是否有异常产生这部分都会执行,即时发生OutOfMemeryError也会执行,通常用于处理善后清理工作
注意:finally是在return表达式运行后执行的
此时将要return的结果已经暂存起来,待到finally块执行完之后再次执行return语句返回结果
测试小案例
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int b = 20;
try {
System.out.println("try block");
return b += 80;
}
catch (Exception e) {
System.out.println("catch block");
}
finally {
System.out.println("finally block");
if (b > 25) {
System.out.println("b>25, b = " + b);
}
}
return b;
}
使用lambda表达式进行过滤、排序时,出现了空指针异常
说明:按键盘上 ctrl+alt+ t 快捷键可以选择快速生成try catch
评论区