Java自定义运行时异常需继承RuntimeException类,属非检查异常,无需强制处理;基础写法含无参和带消息构造方法,增强版可添加cause参数支持链式异常。

Java 中自定义运行时异常,只需继承 RuntimeException 类即可。它属于非检查异常(unchecked exception),调用方无需强制 try-catch 或 throws 声明,适合表示程序逻辑错误、非法参数、状态不一致等本应由开发者提前避免的问题。
一、基础写法:空参构造 + 带消息构造
最简实践是提供两个常用构造方法:无参构造和接收 String 消息的构造:
public class InvalidAgeException extends RuntimeException {
public InvalidAgeException() {
super("年龄值无效");
}
public InvalidAgeException(String message) {
super(message);
}
}
这样既支持直接抛出 throw new InvalidAgeException(),也支持带上下文信息 throw new InvalidAgeException("年龄不能小于 0")。
二、增强可读性:添加 cause 支持(链式异常)
若需包装底层异常(比如解析失败引发的 NumberFormatException),建议补充接收 Throwable 的构造方法:
立即学习“Java免费学习笔记(深入)”;
public InvalidAgeException(String message, Throwable cause) {
super(message, cause);
}
使用示例:
try {
int age = Integer.parseInt(input);
if (age < 0) throw new InvalidAgeException("年龄不能为负数");
} catch (NumberFormatException e) {
throw new InvalidAgeException("输入无法转为有效数字", e);
}
三、进阶技巧:附带业务字段(如错误码、时间戳)
若系统需要统一错误处理或日志追踪,可在异常类中添加字段:
public class BusinessException extends RuntimeException {
private final int errorCode;
private final long timestamp;
public BusinessException(int errorCode, String message) {
super(message);
this.errorCode = errorCode;
this.timestamp = System.currentTimeMillis();
}
// getter 方法(便于日志/监控提取)
public int getErrorCode() { return errorCode; }
public long getTimestamp() { return timestamp; }
}
注意:这类字段不会自动出现在堆栈打印中,需配合自定义日志器或全局异常处理器使用。
四、使用注意事项
- 不要在 finally 或资源清理逻辑中抛出自定义 RuntimeException,可能掩盖原始异常
- 避免过度包装——若原异常语义清晰(如 NullPointerException),直接抛出更利于定位问题
- 异常类名建议以 Exception 结尾,且体现业务含义(如 UserNotFoundException、InsufficientBalanceException)
- 所有构造方法最终都应调用父类 RuntimeException 的对应构造,确保堆栈和消息正确传递


















