java中自定义受检异常需继承exception类(非runtimeexception),提供无参、string消息、throwable cause及两者组合共四种构造方法,并在方法中用throws声明或try-catch处理,确保编译期强制处理。

Java 中自定义受检异常,只需让自定义类继承 Exception 类(而非 RuntimeException),并提供合适的构造方法即可。这样编译器就会强制调用方处理该异常——要么 try-catch,要么在方法签名中用 throws 声明。
继承 Exception 的基本写法
自定义异常类应是 public 的,并通常提供以下几种常用构造方法:
- 无参构造:用于最简场景
- 带字符串消息的构造:便于传入错误描述
- 带 cause(即嵌套异常)的构造:支持异常链,利于排查根源
- 同时带 message 和 cause 的构造:更灵活地封装上下文
示例:
public class InsufficientBalanceException extends Exception {
public InsufficientBalanceException() {
super();
}
public InsufficientBalanceException(String message) {
super(message);
}
public InsufficientBalanceException(String message, Throwable cause) {
super(message, cause);
}
public InsufficientBalanceException(Throwable cause) {
super(cause);
}
}
在方法中抛出并强制处理
一旦继承 Exception,该异常就属于受检异常(checked exception)。只要方法体中显式 throw 它,就必须在方法声明中用 throws 告知调用者,或在内部 try-catch 捕获。
例如:
public void withdraw(double amount) throws InsufficientBalanceException {
if (amount > balance) {
throw new InsufficientBalanceException("余额不足,尝试支取:" + amount);
}
balance -= amount;
}
调用该方法时,IDE 或编译器会提示必须处理异常:
try {
account.withdraw(1000.0);
} catch (InsufficientBalanceException e) {
System.err.println("处理失败:" + e.getMessage());
}
和 RuntimeException 的关键区别
是否受检,只取决于继承关系,与类名、注释、使用方式无关:
- 继承
Exception(且非RuntimeException子类)→ 受检异常 → 编译期强制处理 - 继承
RuntimeException→ 非受检异常 → 编译器不强制捕获或声明
注意:Exception 本身是受检的,但它的子类 RuntimeException 是特例,被 JVM 明确设为非受检。因此,即使你写 class MyExc extends Exception {},只要没再继承 RuntimeException,它就是标准的受检异常。
实用建议
- 业务含义明确的错误(如支付失败、参数校验不通过、资源不可用)适合设计为受检异常,提醒调用方必须决策如何应对
- 避免过度使用受检异常——若调用方几乎无法恢复,或异常属于编程错误(如空指针、数组越界),更适合用
RuntimeException子类 - 构造方法中优先调用
super(...),确保异常消息和 cause 能正确传递给父类,支持堆栈追踪和日志诊断
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











