Java 如何自定义异常
早上赶地铁时,你有没有过这种经历:明明买了票,却因为手机没电扫不出闸机,站在闸口急得团团转——这时候你没法用“地铁正常运行”的规则解释自己的困境,得单独用“闸机无法识别有效票”这个特殊情况来处理。
写代码就像管理日常的生活流程,大部分情况都能按既定规则走,但总会遇到一些意料之外却又合理的特殊情况。Java里自带的异常就像通用的“地铁常见故障”提示,比如空指针异常、数组越界异常,可如果遇到像“用户输入了不合理的年龄负数”这种只在你的业务场景里才会出现的情况,就需要我们自己定义异常了。

自定义异常的核心:给特殊情况一个专属“身份”
Java里所有的异常都脱胎于一个叫Throwable的“异常家族”,Exception是专门处理“程序可预见的问题”的分支,我们自定义异常,其实就是在这个分支里给自家业务的特殊问题立个专属的“身份”,让程序能精准识别,不会把“年龄负数”和“数组越界”当成同一个问题处理。
举个例子:你做了一个用户注册功能,要求年龄必须在0到120岁之间,这时候如果用户输入“-5”,Java不会自动弹出提示,因为它不知道“年龄不能为负”是个规则。这时候就需要定义一个InvalidAgeException(年龄无效异常),专门用来处理这种情况。
怎么写一个简单的自定义异常?
写自定义异常的方法很简单,只需要记住一个小技巧:如果是业务里的可恢复问题,就继承Exception;如果是严重的错误,才继承RuntimeException(不用强制捕获)。大部分日常业务需求,我们用Exception就够了。
就像你给孩子做专属的卡通水杯,只需要在普通水杯的基础上,加上孩子喜欢的图案和防漏设计就行,自定义异常也是在Java自带的异常类基础上,加上自己的业务规则。具体代码其实没那么复杂,像这样:
`java
// 自定义年龄无效异常,继承Java的Exception类
public class InvalidAgeException extends Exception {
// 自定义异常可以加一个带提示信息的构造方法,方便快速说明问题
public InvalidAgeException(String message) {
super(message);
}
}
`
这里的构造方法就像你给水杯贴的“防漏”标签,告诉别人这个异常出现时,是“年龄无效”的问题,不是别的。
自定义异常的实际用法:把规则变成“可感知的提醒”
有了专属异常,就能把业务规则变成程序能读懂的提醒,就像地铁闸机扫不出票时,会弹出“无效票”的提示,而不是笼统的“故障”。
还是用注册年龄的例子,当用户输入负数时,我们抛出这个自定义异常,程序就能精准捕捉,然后给用户返回清晰的提示,而不是混乱的错误信息:
`java
// 写一个验证年龄的方法,用自定义异常处理不符合规则的情况
public void checkAge(int age) throws InvalidAgeException {
if (age < 0 || age > 120) {
// 当年龄不符合规则时,抛出我们自己定义的异常
throw new InvalidAgeException("年龄必须在0到120之间,你输入的是:" + age);
}
System.out.println("年龄验证通过!");
}
`
这个方法就像地铁的闸机规则,符合标准就放行,不符合就弹出专属的异常。之后只要在调用这个方法时捕获异常,就能给用户一个明确的反馈,不会再出现“程序出错了”这种让人摸不着头脑的提示。
简单来说,自定义异常就是给业务里的“专属小问题”做个专属标记,让程序能精准处理,就像给家里的每件小物件贴个标签,找起来清晰,用起来方便。