1. 问题
这是service实现类中的登录方法。可以看到,方法中抛出了自定义异常AccountNotFoundException,但是没有进行捕获处理,这是为什么呢?
@Override
public Employee login(EmployeeLoginDTO employeeLoginDTO){
// 根据用户名查询员工数据库
Employee employee = employeeMapper.getByUsername(employeeLoginDTO.getUsername());
//2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)todo
if(employee.getUsername()==null){
throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
}
//3、返回实体对象
return employee;
}
2. 原因
AccountNotFoundException自定义异常继承于RuntimeException
,所以它属于非受检异常。
继承自 java.lang.RuntimeException
的异常是非受检异常,与受检异常不同,编译器不要求开发者在代码中显式捕获或声明非受检异常。开发者可以选择捕获它们,但这不是强制要求。
3. 知识补充
在 Java 中,异常分为两大类:受检异常(Checked Exception) 和 非受检异常(Unchecked Exception)。它们的不同主要体现在程序员如何处理它们以及编译器的行为。
3.1 受检异常(Checked Exception)
3.1.1 定义
受检异常是继承自 java.lang.Exception
(但不包括 RuntimeException
的子类)的异常。受检异常在编译时由编译器强制要求进行处理,开发者必须在程序中显式处理这些异常。
3.1.2 特点
- 必须处理或声明:如果某个方法可能抛出受检异常,开发者必须使用
try-catch
块捕获并处理它,或者在方法签名中使用throws
关键字声明该异常,让调用该方法的代码来处理。 - 典型场景:它们通常用于反映应用程序的合理但可能发生的异常情况,例如文件找不到、网络连接失败、数据库连接异常等。
- 继承体系:
- 受检异常类都直接或间接继承自
java.lang.Exception
类。 - 这些异常通常表示一些可以预料的、且程序能够恢复的错误。
- 受检异常类都直接或间接继承自
3.1.3 常见的受检异常
IOException
:当进行 I/O 操作时,如果出现问题,比如文件找不到、读写失败等,就会抛出这个异常。SQLException
:当与数据库交互时发生异常,例如查询错误或连接失败。ClassNotFoundException
:当 JVM 找不到某个类时,抛出此异常。
3.1.4 设计思考
受检异常的设计初衷是让开发者显式处理那些应用逻辑可能会遭遇的问题,从而提高代码的健壮性。例如,如果程序需要访问一个文件,那么程序必须考虑文件可能不存在的情况。受检异常的目标是迫使开发者提前思考和处理这些场景。
3.2 非受检异常(Unchecked Exception)
3.2.1 定义
非受检异常是继承自 java.lang.RuntimeException
的异常。与受检异常不同,编译器不要求开发者在代码中显式捕获或声明非受检异常。开发者可以选择捕获它们,但这不是强制要求。
3.2.2 特点
- 不强制处理:方法中如果抛出了非受检异常,编译器不会强制要求使用
try-catch
捕获,也不要求在方法签名中用throws
关键字声明。开发者可以决定是否捕获处理。 - 典型场景:非受检异常通常用于程序中的逻辑错误或不可恢复的错误,例如数组越界、空指针异常等。它们通常反映编程时的错误(bug)或无法恢复的情况。
- 继承体系:
- 所有的非受检异常都继承自
RuntimeException
,而RuntimeException
本身继承自java.lang.Exception
。
- 所有的非受检异常都继承自
3.2.3 常见的非受检异常
NullPointerException
:当程序试图访问一个null
对象的属性或方法时,抛出此异常。ArrayIndexOutOfBoundsException
:当访问数组时使用了非法的索引(例如负数或超出数组长度)。ArithmeticException
:当进行非法的算术操作时,例如整数除以零。
3.2.4 设计思考
非受检异常主要用于表示那些程序运行中出现的逻辑错误或不可预测的异常情况。它们不应该强制要求开发者处理,因为很多时候这些异常并不是可以预见或处理的,而是代码中的逻辑错误。例如,空指针异常通常表明代码中存在 null
检查遗漏的问题。
3. 3 受检异常和非受检异常的对比
什么时候使用受检异常 vs 非受检异常
- 受检异常:当异常是可以预料的,并且程序可以采取措施恢复时,应该使用受检异常。例如,文件系统操作、网络通信等与外部环境交互时出现的异常。
- 非受检异常:当异常是由编程错误引起的,或者无法恢复时,应该使用非受检异常。例如,空指针、数组越界或算术运算错误。