【Java】异常处理:从入门到精通

【Java】异常处理:从入门到精通
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:【Java】内容概括
在这里插入图片描述


在这里插入图片描述


【前言】
在Java开发中,异常处理是保证程序健壮性的核心环节。新手常因忽视异常导致程序崩溃,老手也可能因滥用try-catch埋下性能隐患。本文将从异常本质出发,逐层拆解异常体系、处理机制、实战技巧与最佳实践,附带完整代码案例和可视化分析,帮你彻底掌握Java异常。

文章目录:

一、什么是异常?

1.异常的概念

异常(Exception)是程序执行过程中发生的特殊情况或出现错误,他会打断程序正常流程。

类型父类定义示例是否可处理
Error(错误)Throw able虚拟机级别的严重问题,如内存溢出、栈溢出内存溢出(OutOfMemoryError)、栈溢出(StackOverflowError)❌ 不可处理,程序通常直接崩溃
Exception(异常)Throw able程序运行中的可预期问题,如空指针、文件不存在空指针异常(NullPointerException)、文件不存在异常(FileNotFoundException)✅ 可通过代码捕获并处理

2.常见的异常

  • 算术异常
publicclassTest{publicstaticvoidmain(String[] args){System.out.println(100/0);}}
在这里插入图片描述
  • 数组越界异常
publicstaticvoidmain(String[] args){int[] array ={8,2,6};System.out.println(array[4]);}
在这里插入图片描述
  • 空指针异常
publicstaticvoidmain(String[] args){int[] array =null;System.out.println(array.length);}
在这里插入图片描述

3.异常的体系结构

在这里插入图片描述
Java体系以Throwable为顶层父类,下设ErrorException两大部分,Exception又分为受查异常(编译时异常)和非受查异常(运行时异常)Error是指Java虚拟机无法解决的严重问题,比如:Jvm内部错误,资源耗尽等Exception:异常产生后,可以通过代码处理。

4.异常的分类

4.1 编译时异常

在这里插入图片描述
在这里插入图片描述

4.2运行时异常

RunTimeException以及其⼦类对应的异常,都称为运⾏时异常。⽐如:

NullPointerExceptionArrayIndexOutOfBoundsExceptionArithmeticException

二、异常处理核心机制

Java提供try , catch , finally , throw , throws五个关键字处理异常,流程:捕获异常,处理异常,释放资源

1.异常抛出-throw

在编译时,程序出现错误,就要用throw抛出异常,将错误信息告知调用者(eg:参数检测)。

thrownewXXXException("异常产⽣的原因");

【注意】

throw必须写在⽅法体内部抛出的对象必须是Exception或者Exception的⼦类对象如果抛出的是RunTimeException或者RunTimeException的⼦类,则可以不⽤处理直接交给JVM来处理如果抛出的是编译时异常,⽤⼾必须处理,否则⽆法通过编译异常⼀旦抛出,其后的代码就不会执⾏

2.异常的声明-throws

如果方法体内部无法处理异常,可通过throws在方法签名上声明异常,将异常处理责任,交给调用者(受查异常必须声明)

publicstaticvoidmain(String[] args)throwsFileAlreadyExistsException

【注意】

throws必须跟在⽅法的参数列表之后声明的异常必须是Exception或者Exception的⼦类⽅法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间⽤逗号隔开,如果抛出多个 异常类型具有⽗⼦关系,直接声明⽗类即可。调⽤声明抛出异常的⽅法时,如果该异常是编译时异常/受查异常时,调⽤者必须对该异常进⾏处理,或者继续使⽤throws抛出

3.异常的捕获

执行流程分析

无异常时: try → 正常执行代码 → finally → 程序继续向下。有异常时: try 中异常代码处中断 → 匹配的 catch 处理 → finally → 程序继续向下。无匹配catch时: try → 异常抛出 → finally → 异常向上传递(如未处理,程序崩溃)

下面是一个找不到读取文件的异常:

importjava.io.FileInputStream;importjava.io.FileNotFoundException;publicclassDome{publicstaticvoidfunc()throwsFileNotFoundException{FileInputStream fileInputStream =newFileInputStream("路径");}publicstaticvoidmain(String[] args)throwsFileNotFoundException{try{func();}catch(FileNotFoundException e){ e.printStackTrace();//打印异常信息System.out.println("找不到读取文件的异常,被捕获");}catch(NullPointerException e){System.out.println("空指针异常"); e.printStackTrace();//打印异常信息//与抛出的异常类型不匹配,就不会被捕获}catch(ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界异常"); e.printStackTrace();//打印异常信息}catch(Exception e){}finally{//处理资源关闭,避免浪费}}}

【注意】

try块内抛出异常位置之后的代码将不会被执⾏如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到JVM收到后中断程序----异常是按照类型来捕获的try中可能会抛出多个不同的异常对象,则必须⽤多个catch来捕获----即多种异常,多次捕获如果异常之间具有⽗⼦关系,⼀定是⼦类异常在前catch,⽗类异常在后catch无论try中是否发生异常,finally中的代码⼀定会执⾏的,⼀般在finally中进⾏⼀些资源清理的扫尾⼯作。但是如果finally 中也存在return语句,那么就会执⾏finally中的return,从⽽不会执⾏到try中原有的return

4.异常处理流程

程序先执⾏try中的代码如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配.如果找到匹配的异常类型,就会执⾏catch中的代码如果没有找到匹配的异常类型,就会将异常向上传递到上层调⽤者.⽆论是否找到匹配的异常类型,finally中的代码都会被执⾏到(在该⽅法结束之前执⾏).如果上层调⽤者也没有处理的了异常,就继续向上传递.⼀直到main⽅法也没有合适的代码处理异常,就会交给JVM来进⾏处理,此时程序就会异常终⽌.

三、自定义异常类

自定义的登录功能,用户名异常和密码异常
publicclassDome{privateString name ="lasi";privateString password ="88657";publicvoiddome(String name,String password)throwsUserNameErrorException,PassWordErrorException{if(!this.name.equals(name)){thrownewUserNameErrorException("用户名错误,发生异常");}if(!this.password.equals(password)){thrownewUserNameErrorException("密码错误,异常");}System.out.println("登录成功");}publicstaticvoidmain(String[] args){Dome dome =newDome();try{ dome.dome("lasi","12345");}catch(UserNameErrorException e){ e.printStackTrace();}catch(PassWordErrorException e){ e.printStackTrace();}System.out.println("程序继续执行");}}
在这里插入图片描述
  • 用户名异常
publicclassUserNameErrorExceptionextendsRuntimeException{publicUserNameErrorException(){super();}publicUserNameErrorException(String s){super(s);}}
  • 密码异常
publicclassPassWordErrorExceptionextendsRuntimeException{publicPassWordErrorException(){super();}publicPassWordErrorException(String s){super(s);}}
在这里插入图片描述


【注意】

⾃定义异常通常会继承⾃Exception或者RuntimeException继承⾃Exception的异常默认是受查异常继承⾃RuntimeException的异常默认是⾮受查异常

四、总结

Java异常处理是程序健壮性的基石,核心在于:

理解异常体系:区分 Error (不可处理)和 Exception (可处理),明确受检/非受检异常的区别;掌握核心语法: try-catch-finally 捕获处理, throw 主动抛出, throws 声明传递;自定义异常:贴合业务场景,传递精准错误信息;

异常处理的本质不是“消灭异常”,而是“在异常发生时,让程序以可控、可预期的方式运行”。希望本文能帮你建立系统化的异常处理思维,写出更健壮的Java代码!

如果本文对你有帮助,欢迎点赞+收藏+关注,后续会持续更新Java核心技术干货~

Read more

HarmonyOS6半年磨一剑 - RcImage组件核心架构与状态管理机制

HarmonyOS6半年磨一剑 - RcImage组件核心架构与状态管理机制

文章目录 * 前言 * 项目简介 * 核心特性 * 开源计划 * rchoui官网 * 第一章: 组件架构设计 * 1.1 ComponentV2 装饰器体系 * 1.2 参数系统分层设计 * 1.3 类型系统设计 * 第二章: 状态管理机制 * 2.1 加载状态机设计 * 2.2 状态转换逻辑实现 * 2.3 预览状态管理 * 第三章: 生命周期管理 * 3.1 组件生命周期钩子 * 3.2 状态更新触发机制 * 第四章: 事件系统设计 * 4.1 事件分类与职责 * 4.2 事件触发时机与顺序 * 4.3 事件参数设计 * 第五章: 渲染优化策略

By Ne0inhk
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)

SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)

SQL Server是由微软推出的关系型数据库管理系统,它提供了可靠的数据存储、数据管理和数据分析功能。SQL Server支持多种数据处理功能,包括事务处理、数据分析、报表生成和数据挖掘等,因此在企业和组织中得到广泛应用。 演示系统:Windows server 2025数据中心版 安装包:下载传送门 1、下载并解压安装包,找到解压的安装包,双击【setup.exe】 2、双击【setup.exe】就会打开SQL Server安装中心,点击【安装】-【全新安装或向现有安装添加功能】 3、选择对应版本后,下一步 4、勾选“我接受许可条款”后下一步 5、下一步下一步 6、不勾选,下一步 7、勾选需要的功能,路径建议默认,下一步 8、下一步

By Ne0inhk
你真的会打印日志吗?基于 Spring Boot 的全方位日志指南

你真的会打印日志吗?基于 Spring Boot 的全方位日志指南

—JavaEE专栏— 目录 * 一、日志概述:为什么它比 System.out.println 更重要? * 1.1 日志的核心用途 * 1.2 为什么弃用标准输出? * 二、日志框架体系:门面模式的深度解析 * 2.1 门面模式 (Facade Pattern) * 2.2 常见框架对比 * 三、实战:Spring Boot 日志的基本使用 * 3.1 传统方式获取日志对象 * 3.2 进阶方式:使用 Lombok (@Slf4j) * 四、深入理解日志级别 * 五、日志的高级配置 (application.yml) * 5.1 修改日志级别 * 5.

By Ne0inhk
Spring Security 从入门到实战:搞定认证授权,再也不用手写权限逻辑

Spring Security 从入门到实战:搞定认证授权,再也不用手写权限逻辑

✨道路是曲折的,前途是光明的! 📝 专注C/C++、Linux编程与人工智能领域,分享学习笔记! 🌟 感谢各位小伙伴的长期陪伴与支持,欢迎文末添加好友一起交流! * 目录 * 前言 * 一、Spring Security 是什么? * 1.1 核心功能 * 二、技术组成分布 * 三、认证流程解析 * 3.1 请求处理流程 * 3.2 过滤器链结构 * 四、快速开始 * 4.1 添加依赖 * 4.2 基础配置 * 五、认证机制详解 * 5.1 内存认证(开发测试) * 5.2 数据库认证(生产推荐) * 六、授权控制方式 * 6.1 注解方式

By Ne0inhk