Java入门17——异常

今天我们对 java 入门进行一个收尾,然后咱们就可以同步开启 Java 数据结构部分啦!

只要不放弃,什么时候开始都不晚,让我们一起奋斗吧!

话不多说,开始正题!


一、什么是异常

通俗来讲,就是在我们写程序的时候出现了错误,导致程序无法运行,这个时候就需要异常来帮助我们判断是哪里出错,是一种有效的手段来帮助我们处理这些问题

二、异常分类

首先我们要知道,所有的异常都来自于 Throwable ,也就是所有异常都继承了 Throwable ,然后我们看下图所示:

既然计算机已经分好类了,但是我们万一不想用已有的异常,我们自己能不能自定义一个异常呢?

答案是:当然可以!

但是首先我们要先学好已有的异常,怎样抛出异常呢?

三、抛出与自定义异常的方法

抛出异常的方法

使用 throw 关键字在方法内手动抛出异常对象,适用于检测到非法参数或状态时:

java 复制代码
public void validateAge(int age) {  
    if (age < 0) {  
        throw new RuntimeException("年龄不能为负数");  
    }  
}  
自定义异常的必要性
  • 精准分类:区分业务场景(如"年龄非法"与"用户名重复")。
  • 信息扩展:支持附加错误码、字段名等上下文。
  • 统一处理:便于集中拦截特定业务异常。
自定义异常的实现步骤

1. 定义异常类

选择继承 Exception(受检异常)或 RuntimeException(非受检异常):

java 复制代码
// 非受检异常示例  
public class AgeException extends RuntimeException {  
    public AgeException() {  
        super();  
    }  
    public AgeException(String message) {  
        super(message);  
    }  
}  

2. 使用自定义异常

在业务逻辑中抛出:

java 复制代码
public void setAge(int age) {  
    if (age < 0) {  
        throw new AgeException("年龄值非法: " + age);  
    }  
    this.age = age;  
}  
异常的高级用法

扩展异常类以携带更多上下文信息:

java 复制代码
public class BusinessException extends RuntimeException {  
    private String errorCode;  
    private String field;  

    public BusinessException(String message, String errorCode, String field) {  
        super(message);  
        this.errorCode = errorCode;  
        this.field = field;  
    }  
    // Getter方法省略  
}  

调用示例:

java 复制代码
throw new BusinessException("参数校验失败", "ERR_400", "age");  
测试验证

捕获并处理自定义异常:

java 复制代码
try {  
    person.setAge(-5);  
} catch (AgeException e) {  
    System.err.println("业务异常: " + e.getMessage());  
}  
关键规范
  • 命名 :异常类名以 Exception 结尾(如 InvalidAgeException)。
  • 父类选择
    • RuntimeException:逻辑错误(非强制捕获)。
    • Exception:外部依赖错误(强制捕获)。
  • 构造方法 :至少实现无参和带 String 参数的构造方法。
相关推荐
better_liang1 天前
每日Java面试场景题知识点之-消息队列MQ核心场景与实战
java·面试·kafka·消息队列·rabbitmq·rocketmq·mq
小江的记录本1 天前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小马爱打代码1 天前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理
java·后端·spring
deepin_sir1 天前
10 - 函数
开发语言·python
better_liang1 天前
每日Java面试场景题知识点之-SpringBoot启动流程
java·面试·springboot·源码解析·启动流程
RyFit1 天前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring
z落落1 天前
C#String字符串
开发语言·c#·php
猫头虎-前端技术1 天前
JS 作用域与闭包:从变量提升到闭包陷阱的超详细解析
开发语言·javascript·云计算·bootstrap·ecmascript·openstack·perl
枫叶林FYL1 天前
项目十:事件溯源仓储管理系统(WMS)仿真实现
开发语言·python
繁华落尽,倾城殇?1 天前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete