1. Java异常继承体系的核心设计逻辑
Java异常处理机制本质上是对程序非正常状态的分类管理策略。整个体系以Throwable为根基,向下分化出Exception和Error两大分支。在实际开发中,我们需要特别关注Exception及其子类RuntimeException的区别:
- Checked Exception(编译时异常):继承自Exception的非RuntimeException子类
- Unchecked Exception(运行时异常):RuntimeException及其子类
这种分类不是随意设计的,而是基于Java语言的安全哲学。当年James Gosling团队在设计Java时,强制要求处理可能发生的异常(比如文件不存在、网络中断),以此提高程序健壮性。但有些异常(如空指针、数组越界)属于编码错误,强制处理反而会降低代码可读性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 自定义异常的类型选择标准
2.1 何时继承Exception
当满足以下条件时,你的自定义异常应该直接继承Exception:
- 表示业务逻辑中可预见的异常情况(如订单金额不足)
- 调用方必须处理该异常才能保证业务连续性
- 异常情况属于正常业务流程的一部分
典型场景示例:
java复制// 支付业务异常
public class PaymentException extends Exception {
public PaymentException(String message) {
super(message);
}
}
// 使用时必须处理
try {
processPayment();
} catch (PaymentException e) {
showErrorToast("支付失败: " + e.getMessage());
}
2.2 何时继承RuntimeException
选择继承RuntimeException的情况包括:
- 表示程序错误而非业务异常(如参数校验失败)
- 异常无法通过合理手段恢复(如数据库连接丢失)
- 需要保持代码简洁性的工具类方法
开发框架中常见案例:
java复制// 参数校验异常
public class InvalidParamException extends RuntimeException {
public InvalidParamException(String fieldName) {
super("参数" + fieldName + "不合法");
}
}
// 使用时无需声明
void validateUser(User user) {
if(user.getName() == null) {
throw new InvalidParamException("name");
}
}
3. 面试中的高频陷阱题解析
3.1 经典面试题变体分析
题目:以下代码有什么问题?
java复制class MyException extends RuntimeException {
// 空实现
}
v
