自定义非受检异常需继承 RuntimeException,至少提供无参和带消息构造方法;可增强支持异常原因、添加业务字段(如 age)并重写 toString() 或提供 getter;使用时直接 throw,无需声明。

自定义非受检异常(即运行时异常)只需继承 RuntimeException,无需强制 try-catch 或 throws 声明,适合表示程序逻辑错误或不可恢复的异常情况。
基础写法:空参构造 + 带消息构造
最简实用的写法包含两个标准构造方法:一个无参构造,一个接收异常消息字符串的构造。Java 异常链机制会自动把 message 传给父类 RuntimeException:
<font size="2">public class InvalidAgeException extends RuntimeException {
public InvalidAgeException() {
super();
}
public InvalidAgeException(String message) {
super(message);
}
}</font>
增强写法:支持异常原因(cause)和消息组合
如果需要包装另一个异常(比如底层抛出的 NumberFormatException),建议补充带 Throwable cause 的构造方法;还可增加“消息 + 原因”组合构造,提升调试信息完整性:
public InvalidAgeException(String message, Throwable cause)public InvalidAgeException(Throwable cause)
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
<font size="2">public class InvalidAgeException extends RuntimeException {
public InvalidAgeException() {
super();
}
public InvalidAgeException(String message) {
super(message);
}
public InvalidAgeException(String message, Throwable cause) {
super(message, cause);
}
public InvalidAgeException(Throwable cause) {
super(cause);
}
}</font>
可选优化:添加业务字段与重写 toString
若需在异常中携带上下文数据(如出错的年龄值),可定义私有字段,并在构造中赋值。为便于日志输出,可重写 toString() 或提供 getAge() 方法:
<font size="2">public class InvalidAgeException extends RuntimeException {
private final int age;
public InvalidAgeException(int age) {
super("Invalid age: " + age);
this.age = age;
}
public InvalidAgeException(int age, String message) {
super(message);
this.age = age;
}
public int getAge() {
return age;
}
}</font>
使用示例:直接 throw,无需声明
调用方不用处理该异常,但建议在关键校验点主动抛出,让问题尽早暴露:
<font size="2">public void setAge(int age) {
if (age < 0 || age > 150) {
throw new InvalidAgeException(age, "Age must be between 0 and 150");
}
this.age = age;
}</font>
不复杂但容易忽略:确保构造方法调用 super(...) 正确传递参数,这样堆栈跟踪和 getMessage() 才能正常工作。

















