继承 RuntimeException 可定义非检查型异常,无需强制处理,适用于逻辑错误等场景;需提供无参、带消息、带cause的构造方法,并可直接throw使用。

在 Java 中,自定义异常类继承 RuntimeException 是实现**非检查型异常(unchecked exception)** 的标准方式。这类异常不需要强制 try-catch 或 throws 声明,适合用于程序逻辑错误、参数非法等运行时可避免的问题。
为什么继承 RuntimeException?
继承 RuntimeException 表示该异常是“不强制处理”的:编译器不会报错,调用方可以自由决定是否捕获。相比继承 Exception(检查型异常),它更轻量、更符合业务校验、空值、状态非法等场景的语义。
如何定义一个自定义 RuntimeException 类?
通常只需继承 RuntimeException,并提供几个常用构造方法即可:
- 空参构造
- 接受字符串消息的构造
- 接受消息 + 原始异常(cause)的构造(便于链式异常追踪)
示例:
public class InvalidAgeException extends RuntimeException {
public InvalidAgeException() {
super("年龄不合法");
}
<pre class="brush:php;toolbar:false;">public InvalidAgeException(String message) {
super(message);
}
public InvalidAgeException(String message, Throwable cause) {
super(message, cause);
}}
怎么抛出和使用这个异常?
在业务逻辑中,直接 throw 即可,无需声明 throws:
public void setAge(int age) {
if (age 150) {
throw new InvalidAgeException("年龄必须在 0~150 之间,当前值:" + age);
}
// 正常赋值...
}调用方可以选择捕获(如做日志或友好提示),也可以不处理——程序遇到该异常会沿调用栈向上抛出,最终由 JVM 打印堆栈或被全局异常处理器拦截。
实用建议
- 类名建议以
Exception结尾,语义清晰(如UserNotFoundException) - 消息尽量包含关键上下文(如非法值、操作对象 ID),方便排查
- 如果需要结构化错误信息(如错误码、HTTP 状态码),可在异常类中添加字段,并配合全局异常处理器统一响应
- 避免滥用:不是所有错误都该用 RuntimeException;I/O、网络超时等外部依赖失败,更适合检查型异常或特定运行时异常(如
IOException已是检查型,而SocketTimeoutException继承自RuntimeException)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











