JAVA中常见异常

198 阅读4分钟

10个常见的异常以及解决方式

异常通用解决方案

  1. try catch 代码块捕获处理。
  2. 在方法签名上抛出异常,让调用方法的地方去解决
  3. 全局异常处理器,在程序中丢出(throw)异常,最终会进入异常处理器,一般用来处理自定义的业务异常。

:异常基本上都可以使用以上方法解决,旨在说明对应常见异常的想法,提供排除思路。

一、NullPointerException

空指针异常:当尝试访问未初始化的对象实例或已设置为 null 的对象时,会抛出此异常。

如何解决:

提前预判,代码的规范性。

在可能出现空指针的地方主动去处理掉,比如接口有入参的时候,一定要做参数的校验,针对参数的不同可以给出不同的提示信息,方便后期的排错与维护。

public void printLength(String str) {
    try {
        // 尝试获取字符串长度
        System.out.println("Length of the string: " + str.length());
    } catch (NullPointerException e) {
        System.err.println("字符串为空!!");
    }
}

二、ArrayIndexOutOfBoundsException

数组下标越界异常:当访问数组时,索引超出了数组的有效范围时,会抛出此异常。

如何解决:

一般在学习初期出现,容易在循环中定义循环条件的时候使用fori循环时对起始条件的判断失误,或者直接使用[]访问数组中的不存在的下标(魔法值)。同空指针异常一样,需要进行预判,以及养成良好的编码习惯。

三、ClassCastException

类型转换异常:当试图将对象转换为不兼容类型时,会抛出此异常。

如何解决:

常见于日期格式之间的转换以及String类型与可以参与算术运算类型的转换时。

前端后端都需要对参数进行合理的校验与约束,前端是为了防止用户误输入造成非法参数的产生,后端的校验与约束一是为了程序的健壮性,与测试时不一定走前端。同时也可以防止接口泄漏后,被人恶意填充非法数据。

四、IllegalArgumentException

非法参数异常:当方法接收到非法参数时,会抛出此异常。

如何解决:

参见于调用方法编写入参时,或者是人为定义的一些规则如:年龄不能是负数,日期范围查询时候的begin于end的大小关系。

预判,在处理业务逻辑的时候要对参数做好充分的考虑,预判可能会由人为操作产生的参数异常主动去捕获,方便后期排错。

做校验:

public void checkAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("年龄不能是负数!!");
    }
    System.out.println("年龄是: " + age);
}

五、IOException

输入输出异常:当发生输入/输出错误时,会抛出此异常。

如何解决:

出现该异常时,应该去定位于文件操作相关的代码部分,检查文件的读取路径,配置等信息。

同时该异常是受检查的异常,在编写程序的时候就会要求去处理。

六、OutOfMemoryError

内存溢出异常,

如何解决:

这是error,不能程序能控制的,说明需要调整堆内存大小(-Xmx)或者优化程序(对于一些不重要的对象使用软、弱引用)。

七、ClassNotFoundException

类找不到异常:在springboot开发过程中常见,由于忘记对一些需要使用的类添加进入到ioc容器中产生,或者是一些不应该被装配的类被声明装配但是对应容器中缺乏依赖。

如何解决:

对于一般的项目,添加对应的注解。

对于不在同一个容器中需要启动扫描配置的,需要运用到springboot的自动装配原理,在resources目录下创建META-INF文件夹,然后创建名为spring.factories的文件,在其中添加需要配置的类的全限定类名。

对于上述不像被装配的解决方法是,在类的声明中添加@ConditionalOnClass注解说明加载的范围(条件)

八、SQLException

数据库异常

如何解决:

检查数据库连接相关配置(表名,地址)、sql语句是否有语法错误,数据库连接驱动配置等。

九、ArithmeticException

算术异常:在进行数学运算时出现的异常。如除数为0

如何解决:

预判,主动捕获该异常,一般的数学算式都有其定义域,加条件判断参数是符合其定义域。

十、DateTimeParseException

日期解析异常,在处理日期格式的时候容易出现的异常

解决方案:

统一日期格式,对参数做格式的改变。有时候前端可能会使用时间戳的方式传回时间,这时候需要自己对数据进行处理,如封装一个处理日期格式的工具。