Java中主动抛出自定义异常需先定义继承Exception或RuntimeException的异常类,再用throw new XxxException("msg")触发;业务多用RuntimeException子类避免强制处理,检查非法状态时直接throw,后续代码不执行。

Java 中用 throw 主动抛出自定义异常,核心是:先定义异常类(继承 Exception 或 RuntimeException),再在业务逻辑中用 throw new XxxException("提示信息") 触发。
定义自定义异常类
通常继承 Exception(编译期异常,调用方必须处理)或 RuntimeException(运行时异常,可不显式捕获)。业务中更常用后者,避免强制 try-catch 干扰主流程。
例如:
public class InsufficientBalanceException extends RuntimeException {
public InsufficientBalanceException(String message) {
super(message);
}
// 可选:带错误码的构造方法
public InsufficientBalanceException(String message, int errorCode) {
super(message);
this.errorCode = errorCode;
}
private int errorCode;
}
在业务方法中使用 throw 抛出
检查到非法状态(如余额不足、参数为空、权限不匹配)时,直接 throw 实例化的新异常。无需 return,后续代码不再执行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 参数校验失败:如用户 ID 为 null,抛
IllegalArgumentException或自定义InvalidParamException - 业务规则违反:如转账金额超限、库存不足,抛对应语义的自定义异常
- 避免裸 throw
new Exception("xxx")—— 丢失类型信息,不利于统一处理
配合 throws 声明(仅对编译期异常)
如果自定义异常继承 Exception(非 RuntimeException 子类),方法签名需用 throws 声明,调用方要么 try-catch,要么继续上抛。
例如:
public void withdraw(String accountId, BigDecimal amount)
throws InsufficientBalanceException, AccountNotFoundException {
// ... 业务逻辑
if (balance.compareTo(amount) < 0) {
throw new InsufficientBalanceException("余额不足,当前:" + balance);
}
}
统一异常处理(推荐搭配 Spring @ControllerAdvice)
抛出后不立即 catch,而是由全局异常处理器拦截,返回结构化响应(如 JSON 错误码+消息),保持 Controller 层干净。
- 定义统一返回体:
Result<T>包含 code、msg、data - 用
@ExceptionHandler(InsufficientBalanceException.class)捕获并转换 - 日志记录异常堆栈,但前端只暴露友好提示,不泄露敏感细节

















