java中自定义异常需继承exception类以创建受检异常,强制编译期处理;必须提供三个标准构造方法;类名应体现业务语义并以exception结尾;方法需声明throws且调用方必须捕获或再抛出。

Java 中自定义异常继承 Exception 类,是为了创建一个受检异常(Checked Exception),它会在编译期强制调用方处理——要么用 try-catch 捕获,要么在方法签名中用 throws 声明。这种设计适合表达业务中可预期、需主动应对的问题,比如“余额不足”“订单已取消”“促销码失效”等。
必须继承 Exception,不能是 RuntimeException
这是关键前提:只有直接或间接继承 java.lang.Exception(且不经过 RuntimeException)的类,才属于受检异常。如果误写成 extends RuntimeException 或 extends Throwable,编译器就不会强制处理,失去设计本意。
- ✅ 正确:
public class InsufficientBalanceException extends Exception - ❌ 错误:
public class InsufficientBalanceException extends RuntimeException(变成非受检异常) - ❌ 错误:
public class InsufficientBalanceException extends Throwable(不是标准异常路径,也不被编译器识别为受检异常)
类名要体现业务语义,以 Exception 结尾
命名不是随便起的。它要让调用方一眼看懂发生了什么,也便于日志归类、监控告警或前端提示映射。
- 推荐写法:
OrderAlreadyShippedException、InvalidPromotionCodeException、UserNotActivatedException - 避免泛化命名:
BizException、MyException—— 无法传达具体含义,也削弱了异常分类的价值
至少提供三个标准构造方法
构造方法不是摆设,而是支撑异常链、日志可追溯、调试可定位的核心能力。缺一不可:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
public XxxException():默认提示,如super("订单状态非法") -
public XxxException(String message):支持传入动态消息,如super("用户 " + userId + " 未激活") -
public XxxException(String message, Throwable cause):最关键!用于包装底层异常(比如把SQLException封装成业务异常),确保原始堆栈和根因不丢失
示例代码:
public class OrderAlreadyShippedException extends Exception {
public OrderAlreadyShippedException() {
super("订单已发货,不可重复操作");
}
public OrderAlreadyShippedException(String message) {
super(message);
}
public OrderAlreadyShippedException(String message, Throwable cause) {
super(message, cause); // ← 这句必须有,否则异常链断裂
}
}
在方法中声明并抛出,调用方必须响应
继承完 Exception 只是第一步;真正发挥受检机制作用,依赖于使用方式:
- 业务方法签名中明确
throws OrderAlreadyShippedException - 内部校验失败时,用
throw new OrderAlreadyShippedException("订单ID: " + orderId) - 调用该方法的上层代码,编译器会报错:“unreported exception OrderAlreadyShippedException; must be caught or declared”,逼你做决定
这种强制力,正是受检异常的价值所在——不让关键业务异常被静默忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










