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

news2024/10/3 4:25:10
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.coloradmin.cn/o/2185524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++系列-多态

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 多态 多态就是不同类型的对象&#xff0c;去做同一个行为&#xff0c;但是产生的结果是不同的。 比如说&#xff1a; 都是动物叫声&#xff0c;猫是喵喵&#xff0c;狗是汪汪&am…

安装图片标识工具anylabeling

目录 下载压缩包 创建环境 安装opencv 安装第三方库 运行setup.py文件 安装过程可能会出现的错误&#xff1a; 错误1 错误2 安装完成 图标更换 之前提到的嵌入式开发】可编程4k蓝牙摄像头点击器还可以训练模型&#xff0c;使图像识别精度提高 现在讲解&#xff0c;如…

wsl(4) -- 编译驱动模块

1. 内核源码 编译模块需要内核源码信息&#xff0c;wsl是修改过的内核无法使用下面的命令从标准镜像源上下载内核源码信息。 sudo apt-get install kernel-headers-$(uname -r) sudo apt-get install kernel-devel-$(uname -r)2. 下载wsl内核源码 可以考虑下载wsl的源码重新…

【分页】Spring Boot 列表分页 + javaScript前台展示

后端&#xff1a; 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …

信息学奥赛复赛复习09-CSP-J2020-03表达式求值前置知识点-中缀表达式求值、模运算、模运算性质、栈

PDF文档回复:20241002 **1 P1981 [NOIP2013普及组] 表达式求值 ** [题目描述] 给定一个只包含加法和乘法的算术表达式&#xff0c;请你编程计算表达式的值 [输入格式] 一行&#xff0c;为需要你计算的表达式&#xff0c;表达式中只包含数字、加法运算符 “” 和乘法运算符 …

C/C++语言基础--C++IO流、输入输出流、文件流、字符串流、重定向流等详解

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 流思想&#xff0c;我认为在计算机中是一个很重要的思想&#xff0c;因为计算机、编程无非就是获取数据&#xff0c;然后对数据进行操作&#xff1b;C给主要给我们提供了3种流&#xff0c;输入输出流、文件流…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

# VirtualBox中安装的CentOS 6.5网络设置为NAT模式时,怎么使用SecureCRT连接CentOS6.5系统?

VirtualBox中安装的CentOS 6.5网络设置为NAT模式时&#xff0c;怎么使用SecureCRT连接CentOS6.5系统&#xff1f; 一、查询 【VirtualBox Host-Only Network】虚拟网卡的网络配置 IP。 1、按键盘上WIN R 组合键&#xff0c;打开【运行】&#xff0c;输入【 ncpa.cpl 】&…

C0012.Clion改用VS编译器开发Qt界面

1.VS编译器添加 2.配置MSVC2019环境变量 3.各种问题报错与解决 问题描述 warning C4819&#xff1a;该文件包含不能在当前代码页(936)中表示的字符。解决办法 在CMakeLists.txt中添加如下代码 # 如下代码只在使用VS编译器时需要&#xff0c;使用mingw32编译器时需要注释掉 #…

利用Numpy实现全连接神经网络实验分析

一、实验要求 用 python 的 numpy 模块实现全连接神经网络。网络结构为一个输入层、一个隐藏层、一个输出层。隐藏层的激活函数为 Relu 函数&#xff0c;输出层的激活函数为 softmax 函数&#xff0c;损失函数为交叉熵。 二、实验目的 学会构建一个简单的全连接神经网络模型学…

鸿蒙网络管理模块01——HTTP与WebSocket请求数据

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 鸿蒙的网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1…

影刀RPA实战:网页爬虫之电影数据

1.实战目标 电影自媒体是指个人或团队通过互联网平台&#xff0c;如微博、微信公众号、抖音、B站等&#xff0c;发布与电影相关的内容&#xff0c;包括但不限于电影评论、推荐、幕后制作揭秘、明星访谈等。这些内容旨在吸引电影爱好者&#xff0c;并与之互动&#xff0c;构建起…

十六字心传

中国文化传统中著名的“十六字心传”&#xff1a;“人心惟危&#xff0c;道心惟微&#xff1b;惟精惟一&#xff0c;允执厥中。 ”语出于《虞书大禹谟》。 人心与道心&#xff1a;人的人欲与天理的区别&#xff1b;所谓“人心惟危”&#xff0c;即是说人们的那种物欲情欲&…

【FPGA开发】Xilinx FPGA差分输入时钟的使用方法

正文 以前在使用ZYNQ的领航者ZYNQ7020进行FPGA学习时&#xff0c;它们使用的单端50M的输入时钟&#xff0c;在verlog代码编写上比较简单&#xff0c;而现在使用Alinx的AXU3EG开发板时&#xff0c;发现它使用的是200M的差分输入时钟&#xff0c;哪这个时候&#xff0c;输入时钟要…

pyecharts-快速入门

pyecharts文档&#xff1a;渲染图表 - pyecharts - A Python Echarts Plotting Library built with love. pyecharts-gallery文档&#xff1a;中文简介 - Document (pyecharts.org) 一、快速入门案例 from pyecharts.charts import Barbar Bar() bar.add_xaxis(["衬衫…

7-3 集合的运算-并、交、对称差

顺序表&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;int *pnew int[n];for(int i0;i<n;i)cin>>p[i];int m;cin>>m;int *qnew int [m];for(int j0;j<m;j)cin>>q[j];int *bingnew int[nm];int *jia…

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…

Elasticsearch基础_5.ES聚合功能

文章目录 一、数据聚合1.1、桶聚合1.1.1、单维度桶聚合1.1.2、聚合结果排序1.1.3、限定聚合范围 本文只记录ES聚合基本用法&#xff0c;后续有更复杂的需求可以查看相关书籍&#xff0c;如《Elasticsearch搜索引擎构建入门与实战》 一、数据聚合 聚合可以让我们极其方便的实现…

进程和线程之间的通用方式

进程之间的通信方式有哪些 进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是指不同进程之间传递信息和数据的机制。由于进程之间的内存空间是相互独立的&#xff0c;因此必须使用特定的通信方式来实现数据共享。 以下是常见的进程间通信方式&#xff1…

【前端开发入门】css快速入门

目录 引言一、css盒模型1. 盒模型概念2. 盒模型案例 二、css编写1. html文件内部编写1.1 标签style属性编写1.2 css选择器关联1.2.1 id选择器1.2.2 class选择器1.2.3 标签选择器1.2.4 css选择器作用域1.2.5 其他选择器1.2.6 各css选择器优先级 2. 单独维护css文件2.1 创建css文…