java如何自定义异常:分两类快速落地
java如何自定义异常,核心是新建类继承Exception(受检异常,编译强制捕获)或RuntimeException(非受检异常,编译不强制处理),补全无参、消息、带原因三个构造方法,再在业务方法中用throw抛出,上层通过catch精准捕获;业务场景为外部资源调用、数据校验时优先选受检异常,程序内部逻辑错误优先选非受检异常,严格遵循Java语言规范JLS11版本给出的异常继承规则,不要直接继承Throwable,否则会打破异常体系分层。
java如何自定义异常:两种类型创建代码
你先分清两种异常的继承父类,二者代码结构基本一致,仅父类不同。
| 异常类型 | 继承父类 | 编译要求 | 适用场景 |
|---|---|---|---|
| 受检自定义异常 | Exception | 必须throws声明或try-catch捕获,否则编译失败 | 文件读写、数据库访问、外部接口调用等外部环境问题 |
| 非受检自定义异常 | RuntimeException | 编译阶段不强制处理,运行时才抛出 | 参数非法、业务规则不满足等程序内部逻辑问题 |
下面是受检异常完整代码,三个构造方法缺一不可。
publicclassOrderCheckExceptionextendsException{publicOrderCheckException(){super();}publicOrderCheckException(Stringmessage){super(message);}publicOrderCheckException(Stringmessage,Throwablecause){super(message,cause);}}只需要把父类改成RuntimeException,就变成非受检异常,无需修改其他代码。
java如何自定义异常:抛出与捕获实操
受检异常必须在方法上加throws声明,非受检异常可以省略声明。
抛出异常的业务方法示例:
publicvoidcheckOrder(Longid)throwsOrderCheckException{if(id==null){thrownewOrderCheckException("订单编号不能为空");}}调用方法时用catch精准捕获自定义异常,不要直接捕获顶层Exception,避免捕获无关错误。
publicstaticvoidmain(String[]args){try{checkOrder(null);}catch(OrderCheckExceptione){System.out.println(e.getMessage());}}java如何自定义异常:边界限制与优化技巧
不要给自定义异常添加过多业务字段,仅保留异常信息与根因,避免异常类过于臃肿。
多层业务模块建议搭建异常体系,创建基础业务异常父类,再细分订单、用户、支付等子异常,便于分层捕获处理。
一个明确限制:不要继承Error类来自定义异常,Error代表JVM级别的严重故障,程序难以处理,强行继承会违背Java异常体系设计逻辑。
非受检异常不能滥用,大量使用会弱化代码的异常处理意识,团队协作场景下,外部依赖类异常尽量使用受检异常,强制调用方做好容错处理。

想要了解更多关于java如何自定义异常的文章欢迎访问:百科