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如何自定义异常的文章欢迎访问:百科