Java中自定义异常需继承Exception或RuntimeException,分别对应检查型与非检查型异常;定义时提供多构造方法;业务中用throw抛出,调用处用try-catch捕获处理,并推荐添加错误码等业务字段及统一异常处理器。

在 Java 中捕获并处理自定义异常,和处理内置异常(如 NullPointerException)方式一致:先定义异常类,再用 throw 主动抛出,最后用 try-catch 捕获并处理。
定义自定义异常类
自定义异常需继承 Exception(检查型异常)或 RuntimeException(非检查型异常):
- 继承
Exception:调用方必须显式处理(try-catch或throws),适合业务中必须关注的错误,如“余额不足”“用户名已存在” - 继承
RuntimeException:无需强制处理,适合程序逻辑错误或不可恢复的异常,如“参数非法”“状态不一致”
推荐提供至少两个构造方法:无参构造、带消息字符串的构造(可选带 cause 的构造):
public class InsufficientBalanceException extends Exception {
public InsufficientBalanceException() {
super("账户余额不足");
}
public InsufficientBalanceException(String message) {
super(message);
}
public InsufficientBalanceException(String message, Throwable cause) {
super(message, cause);
}
}
在业务代码中主动抛出异常
当检测到业务规则被违反时,使用 throw new XxxException(...) 抛出:
public void withdraw(double amount) throws InsufficientBalanceException {
if (amount > balance) {
throw new InsufficientBalanceException("取款金额 " + amount + " 超过当前余额 " + balance);
}
balance -= amount;
}
注意:若自定义异常继承 Exception,方法签名需声明 throws;若继承 RuntimeException,可省略声明。
用 try-catch 捕获并处理
调用可能抛出自定义异常的方法时,用 try-catch 捕获对应类型,并做有意义的处理(如提示用户、记录日志、降级响应等):
try {
account.withdraw(500.0);
} catch (InsufficientBalanceException e) {
System.err.println("操作失败:" + e.getMessage());
// 可选:记录日志
logger.warn("取款失败", e);
// 可选:返回友好提示给前端
return Response.error("余额不足,请充值");
}
也可用多 catch 捕获多种异常,或用 Java 7+ 的多异常语法:
catch (InsufficientBalanceException | InvalidAmountException e) {
handleBusinessError(e);
}
进阶建议
- 异常类名应以
Exception结尾,语义清晰(如UserNotFoundException) - 避免在
catch中只写e.printStackTrace(),应结合日志框架记录完整堆栈 - 可在自定义异常中添加业务字段(如错误码、订单号),便于追踪和分类处理
- 对 API 接口,建议统一异常处理器(如 Spring 的
@ControllerAdvice),避免重复写 try-catch
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











