当前位置: 首页 > article >正文

Java try-catch结构异常处理机制与 IllegalArgumentException 详解

1. Java 异常处理概述

在编程中,异常(Exception)是一种处理程序运行时出现错误或不正常情况的机制。它能够帮助程序员优雅地捕获和处理错误,避免程序因为未处理的错误而崩溃。Java 提供了强大的异常处理机制,使得程序在出现意外情况时,可以通过捕获和处理异常来保持系统的稳定性。

1.1 异常的分类

在 Java 中,异常可以分为两类:

  • 可检查异常(Checked Exception):继承自 Exception 类的异常,编译器要求程序必须显式地捕获或声明这些异常。例如 IOExceptionSQLException 等。

  • 不可检查异常(Unchecked Exception):继承自 RuntimeException 类的异常,编译器不强制要求处理这些异常。例如 NullPointerExceptionArithmeticException 等。

1.2 异常处理机制

Java 通过 try-catch-finally 语句块来实现异常处理。具体流程如下:

  • try 块:包含可能会抛出异常的代码。如果抛出异常,控制会跳到相应的 catch 块。
  • catch 块:捕获并处理特定类型的异常。如果 try 块抛出某种异常,Java 会依次检查各个 catch 块,以找到匹配的异常类型来进行处理。
  • finally 块:不管是否发生异常,finally 块中的代码都会被执行,通常用于资源的清理。
try {
    // 可能抛出异常的代码
    riskyOperation();
} catch (SpecificExceptionType e) {
    // 异常处理代码
} finally {
    // 清理资源,最终都会执行
    cleanup();
}
2. IllegalArgumentException 异常解析
2.1 异常定义

IllegalArgumentExceptionRuntimeException 的一种,它表示传递给方法的参数不合法,通常用于方法参数校验。这个异常不会被编译器强制要求捕获,因此属于 不可检查异常

2.2 异常触发条件

IllegalArgumentException 在以下情况下会被抛出:

  • 方法接收到非法的参数值。
  • 参数超出了允许的范围。
  • 方法不允许空值,但却传递了空值。
2.3 常见场景
  1. 方法参数校验

    当方法接收到非法参数时,可以抛出 IllegalArgumentException,以提醒调用者参数不合法。

    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("年龄必须在0到150之间");
        }
        this.age = age;
    }
    
  2. 构造方法参数校验

    在构造方法中也常用此异常来校验传入的参数。

    public class Person {
        public Person(String name, int age) {
            if (name == null || name.isEmpty()) {
                throw new IllegalArgumentException("名字不能为空");
            }
            if (age < 0 || age > 150) {
                throw new IllegalArgumentException("年龄不合法");
            }
            this.name = name;
            this.age = age;
        }
    }
    
  3. API 调用时参数校验

    当调用第三方 API 时,可能需要校验传递的参数是否合法。如果不合法,抛出 IllegalArgumentException

    public class UserService {
        public void createUser(String username, String password) {
            if (username == null || username.isEmpty()) {
                throw new IllegalArgumentException("用户名不能为空");
            }
            if (password == null || password.isEmpty()) {
                throw new IllegalArgumentException("密码不能为空");
            }
        }
    }
    
2.4 异常的处理方式
  1. 捕获和处理 IllegalArgumentException

    当调用方法时,如果有可能发生 IllegalArgumentException,可以使用 try-catch 来处理异常。

    try {
        setAge(200);  // 这会抛出异常
    } catch (IllegalArgumentException e) {
        System.out.println("捕获到异常: " + e.getMessage());
    }
    
  2. 将异常传递给调用者

    如果方法内部不打算处理 IllegalArgumentException,可以将其抛出给调用者。

    public void setAge(int age) throws IllegalArgumentException {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("年龄不合法");
        }
        this.age = age;
    }
    

    throw是在编程中用于抛出异常的关键字。当程序在运行时遇到错误或异常情况时,可以使用throw语句主动抛出一个异常对象。抛出异常后,程序将立即停止当前执行的代码,并在调用栈中查找异常处理器来处理这个异常。如果没有相应的异常处理器,程序将终止并显示异常信息。

throw语句通常用在自定义异常类中,可以根据程序的需求来抛出不同类型的异常。抛出异常后,可以使用try-catch语句来捕获并处理异常,或者将异常继续抛出给更高层的代码处理。通过合理地使用throw语句,可以提高程序的健壮性和错误处理能力。

  1. 异常日志记录

    处理 IllegalArgumentException 时,记录详细的异常信息,有助于后续排查。

    try {
        setAge(-1);  // 这会抛出异常
    } catch (IllegalArgumentException e) {
        logger.error("发生IllegalArgumentException异常:" + e.getMessage());
    }
    
3. 如何避免 IllegalArgumentException 异常
3.1 参数校验

为了避免 IllegalArgumentException 异常的发生,可以在代码中进行有效的参数校验:

  1. 参数不能为空:对字符串参数使用 StringUtils.isNotEmpty(),对其他参数使用 Objects.requireNonNull() 进行校验。

  2. 参数范围:对于数值参数使用条件判断进行校验。

  3. 参数格式:对需要特定格式的参数,可以使用正则表达式进行校验。

3.2 断言校验

使用断言机制快速定位参数的合法性问题:

public void setAge(int age) {
    assert age >= 0 && age <= 150 : "年龄不合法";
}
4. 异常调试技巧
4.1 分析异常堆栈

通过异常堆栈信息可以快速定位异常发生的具体位置。

java.lang.IllegalArgumentException: 参数年龄不合法
    at com.example.Person.setAge(Person.java:12)
    at com.example.Main.main(Main.java:5)
4.2 打印日志和调试工具

使用日志打印异常信息或调试工具跟踪代码执行,能够帮助发现问题的根源。

public void setAge(int age) {
    if (age < 0 || age > 150) {
        logger.error("非法年龄参数: " + age);
        throw new IllegalArgumentException("年龄不合法");
    }
}

http://www.kler.cn/news/329693.html

相关文章:

  • 基于YOLOv8的智能植物监测机器人
  • 探索机器人快换盘技术的未来之路:智能化与协作的革新
  • 解决 ERROR: PREPROCESSOR: MACROS TOO NESTED
  • Java工具--stream流
  • 【Linux】tar 压缩使用绝对路径时解压会出现多级文件夹
  • 显示adb报错,uniapp安装自定义基座
  • spring6启用Log4j2日志
  • MySQL高阶2066-账户余额
  • 本地部署开源在线PPT制作与演示应用PPTist并实现异地远程使用
  • 【python实操】python小程序之过七游戏以及单词单复数分类
  • Java - LeetCode面试经典150题(三)
  • 交换基础【计算机网络】
  • MySQL 5.7 数据库的备份与恢复
  • Java项目实战II基于Java+Spring Boot+MySQL的美容院管理系统设计与实现(源码+数据库+文档)
  • 在线css像素px到rem的转换器
  • 准备蓝桥杯和ACM:C++标准库头文件及其常用功能简介
  • 服务器使用frp做内网穿透详细教程,请码住
  • Js运算符(操作符)
  • Swoft2.0学习笔记
  • ESP32 Bluedroid 篇(1)—— ibeacon 广播
  • 软件设计——随手笔记
  • Pytest+selenium UI自动化测试实战实例
  • (8)mysql容器启动第一次无论输入密码与否均会报错处理
  • 检索增强生成(RAG)有什么好的优化方案?
  • 拦截器 Interceptor 详解
  • react中的ref三种形式
  • C# Windows EventHandler事件的使用
  • 足球青训俱乐部管理:Spring Boot技术驱动
  • 两个圆形 一个z里面一个z外面,z里面的大,颜色不同 html
  • 通信工程学习:什么是FTP文件传输协议