讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中自定义异常怎么写_Java自定义异常实现解析

大浩大大_1921

大浩大大_1921

发布时间:2026-01-19 09:17:02

|

682人浏览过

|

来源于php中文网

原创

定义检查型自定义异常需继承Exception,提供无参、String message及含上下文(如orderId)的构造方法,字段final并提供getter;运行时异常则继承RuntimeException,须包含message和cause构造方法;throw抛实例,throws声明类型;异常类应实现Serializable,避免不可序列化字段,统一message格式以利日志定位。

在java中自定义异常怎么写_java自定义异常实现解析

Java 中自定义异常不是必须继承 Exception,而是要看你想要的是检查型异常(checked)还是非检查型异常(unchecked):继承 Exception(或其子类,但不包括 RuntimeException)就是 checked;继承 RuntimeException 就是 unchecked。

怎么定义一个典型的检查型自定义异常

适用于必须显式处理的业务场景,比如「用户余额不足」这类需要调用方强制 try-catch 或 throws 的情况。

  • 继承 Exception,不要继承 RuntimeException
  • 提供至少两个构造方法:无参、带 String message 参数的
  • 如果需要携带额外上下文(如错误码、订单 ID),可增加带参数的构造方法,并把字段设为 final 且提供 getter
  • 不需要重写 toString() 或 printStackTrace() —— 父类已实现好
public class InsufficientBalanceException extends Exception {
    private final String orderId;

    public InsufficientBalanceException(String message) {
        super(message);
        this.orderId = null;
    }

    public InsufficientBalanceException(String message, String orderId) {
        super(message);
        this.orderId = orderId;
    }

    public String getOrderId() {
        return orderId;
    }
}

怎么定义一个运行时自定义异常

适用于编程错误或不可恢复的逻辑问题,比如「传入非法状态值」「配置项缺失」,调用方无需强制捕获。

  • 直接继承 RuntimeException(不要绕道继承 Exception 再 throw new RuntimeException(...))
  • 同样建议提供 String message 和 Throwable cause 构造方法,方便链式异常追踪
  • IDE 自动生成的构造方法基本够用,但要注意别漏掉 cause 版本 —— 否则嵌套异常信息会丢失
public class InvalidOrderStatusException extends RuntimeException {
    public InvalidOrderStatusException(String message) {
        super(message);
    }

    public InvalidOrderStatusException(String message, Throwable cause) {
        super(message, cause);
    }
}

throw 和 throws 容易混淆的点

很多人写完自定义异常类,却在使用时卡在语法上。关键就两条:

立即学习“Java免费学习笔记(深入)”;

  • throw 是语句,用于「抛出一个异常实例」,后面跟的是对象:throw new InsufficientBalanceException("balance too low")
  • throws 是方法声明的一部分,用于「声明可能抛出的异常类型」,后面跟的是类名:public void pay() throws InsufficientBalanceException
  • 如果自定义异常是 unchecked(即继承 RuntimeException),throws 声明可省略,但加上也合法 —— 不影响编译,只是没强制意义
  • 检查型异常如果不声明 throws,又没在方法体内 try-catch,编译直接报错:unreported exception XXX; must be caught or declared to be thrown

序列化和日志打印时的坑

自定义异常如果要跨 JVM 传输(如 Dubbo、RMI)或写入日志文件,得小心几个细节:

  • 务必让异常类实现 Serializable 接口(JDK 8+ 默认支持,但显式写上更稳妥)
  • 避免在异常字段中存不可序列化的对象(如 Thread、Connection),否则反序列化失败
  • 重写 getLocalizedMessage() 没必要;但如果你覆盖了 getMessage(),要确保它不依赖外部状态(比如不能去查数据库)
  • 日志框架(如 Logback)默认只打印 toString(),而它的默认实现是 getClass().getName() + ": " + getMessage() —— 所以重点还是把 message 构造清楚

真正容易被忽略的是:很多团队写了自定义异常,却没统一 message 格式,导致日志里全是「余额不足」这种模糊描述,缺少订单号、用户 ID、时间戳等定位信息。与其靠 catch 后手动拼字符串,不如在构造方法里收口处理。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
dubbo和zookeeper有什么区别
dubbo和zookeeper有什么区别

dubbo和zookeeper的区别:1、功能定位;2、使用场景;3、数据存储与协调;4、集成与关系;5、性能与可靠性;6、扩展性与灵活性;7、社区与生态系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2024.02.23

springcloud和dubbo有哪些区别
springcloud和dubbo有哪些区别

springcloud和dubbo的区别:1、定位与关注点;2、生态环境与集成性;3、调用方式与性能;4、组件与功能;5、定制性与灵活性;6、学习曲线与上手难度;7、社区支持与维护。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

276

2024.02.23

dubbo原理和机制是什么
dubbo原理和机制是什么

dubbo原理和机制的解释:1、核心组件;2、通信原理;3、集群容错;4、自动发现与注册;5、负载均衡与路由;6、序列化与传输;7、监控与日志;8、扩展性;9、安全性;10、与spring集成等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

181

2024.02.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6499

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6499

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6499

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2744

2023.09.04

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn