Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
Java从入门到“放弃”(精通)之旅🚀——JavaSE终篇(异常)
一、异常的概念与体系结构
1.1 什么是异常?
在生活中,当一个人表情痛苦时,我们可能会关心地问:"你是不是生病了?"在程序中也是如此,即使我们绞尽脑汁将代码写得尽善尽美,程序运行时仍可能出现各种问题,比如数据格式不对、网络不通畅、内存不足等。
在Java中,将程序执行过程中发生的不正常行为称为异常。例如:
// 算术异常
System.out.println(10 / 0); // ArithmeticException: / by zero// 数组越界异常
int[] arr = {1, 2, 3};
System.out.println(arr[100]); // ArrayIndexOutOfBoundsException// 空指针异常
int[] arr = null;
System.out.println(arr.length); // NullPointerException
1.2 异常的体系结构
Java中的异常种类繁多,为了分类管理,Java维护了一个异常体系结构:
Throwable
├── Error
└── Exception├── IOException├── ClassNotFoundException├── CloneNotSupportedException└── RuntimeException├── ArithmeticException├── NullPointerException├── ArrayIndexOutOfBoundsException└── ...
- Throwable:异常体系的顶层类
- Error:Java虚拟机无法解决的严重问题,如StackOverflowError和OutOfMemoryError
- Exception:程序员可以通过代码处理的异常
1.3 异常的分类
根据发生时机,异常可分为:
- 编译时异常(Checked Exception):在编译期间就能发现的异常
- 运行时异常(Unchecked Exception):RuntimeException及其子类,在程序运行时才会出现
// 编译时异常示例
@Override
public Person clone() {return (Person)super.clone(); // 需要处理CloneNotSupportedException
}// 运行时异常示例
int[] arr = null;
System.out.println(arr.length); // NullPointerException
二、异常的处理方式
2.1 防御式编程的两种风格
- LBYL(Look Before You Leap):事前检查
boolean ret = false;
ret = 登陆游戏();
if (!ret) {处理登陆游戏错误;return;
}
ret = 开始匹配();
if (!ret) {处理匹配错误;return;
}
// ...更多检查
- EAFP(It’s Easier to Ask Forgiveness than Permission):事后处理
try {登陆游戏();开始匹配();游戏确认();选择英雄();载入游戏画面();
} catch (登陆游戏异常) {处理登陆游戏异常;
} catch (开始匹配异常) {处理开始匹配异常;
}
// ...更多catch块
Java主要采用EAFP风格,通过五个关键字处理异常:throw
、try
、catch
、finally
、throws
。
2.2 异常的抛出(throw)
使用throw
关键字抛出异常:
public static int getElement(int[] array, int index) {if (null == array) {throw new NullPointerException("传递的数据为null");}if (index < 0 || index >= array.length) {throw new ArrayIndexOutOfBoundsException("传递的数组下标越界");}return array[index];
}public static void main(String[] args) {int[] array = {1, 2, 3};getElement(array, 3); // 抛出ArrayIndexOutOfBoundsException
}
2.3 异常的捕获
2.3.1 异常声明(throws)
public class Config {public void openConfig(String filename) throws FileNotFoundException {if (!filename.equals("config.ini")) {throw new FileNotFoundException("配置文件名字不对");}// 打开文件}
}public static void main(String[] args) throws FileNotFoundException {Config config = new Config();config.openConfig("config.ini");
}
2.3.2 try-catch捕获处理
public static void main(String[] args) {Config config = new Config();try {config.openConfig("config.txt");System.out.println("文件打开成功");} catch (FileNotFoundException e) {System.out.println("文件不存在,错误信息:" + e.getMessage());e.printStackTrace(); // 打印完整调用栈}System.out.println("异常处理后的代码");
}
2.3.3 finally块
public static int getData() {Scanner sc = null;try {sc = new Scanner(System.in);int data = sc.nextInt();return data;} catch (InputMismatchException e) {e.printStackTrace();} finally {System.out.println("finally中代码");if (null != sc) {sc.close(); // 确保资源被释放}}return 0;
}
面试题:finally中的语句一定会执行吗?
答:正常情况下一定会执行,除非遇到:
- 在try或catch块中调用System.exit()
- 程序所在线程死亡
- 关闭CPU
三、异常处理流程
public static void main(String[] args) {try {func();} catch (ArrayIndexOutOfBoundsException e) {e.printStackTrace();}System.out.println("after try catch");
}public static void func() {int[] arr = {1, 2, 3};System.out.println(arr[100]); // 抛出异常
}
异常处理流程总结:
- 执行try中的代码
- 出现异常则匹配catch块
- 找到匹配则执行catch,否则向上传递
- 无论是否匹配,finally都会执行
- 如果一直未被处理,最终由JVM处理,程序终止
四、自定义异常类
Java内置异常类不能满足所有需求时,可以自定义异常:
// 自定义用户名异常
class UserNameException extends Exception {public UserNameException(String message) {super(message);}
}// 自定义密码异常
class PasswordException extends Exception {public PasswordException(String message) {super(message);}
}// 使用自定义异常
public class Login {private String userName = "admin";private String password = "123456";public static void loginInfo(String userName, String password) throws UserNameException, PasswordException {if (!userName.equals("admin")) {throw new UserNameException("用户名错误!");}if (!password.equals("123456")) {throw new PasswordException("密码错误!");}System.out.println("登陆成功");}public static void main(String[] args) {try {loginInfo("admin", "123");} catch (UserNameException e) {System.out.println("用户名异常:" + e.getMessage());} catch (PasswordException e) {System.out.println("密码异常:" + e.getMessage());}}
}
注意事项:
- 自定义异常通常会继承自 Exception 或者 RuntimeException
- 继承自 Exception 的异常默认是受查异常
- 继承自 RuntimeException 的异常默认是非受查异常.
总结
Java异常处理是编写健壮程序的关键技术。通过合理的异常处理,我们可以:
- 提高程序的容错性
- 分离正常逻辑和错误处理逻辑
- 提供更清晰的错误信息
- 确保资源被正确释放
记住异常处理的原则:对可恢复情况使用受检异常,对编程错误使用运行时异常,避免滥用异常处理机制。
JavaSE往期专栏
- Java从入门到“放弃”(精通)之旅——启航①
- Java从入门到“放弃”(精通)之旅——数据类型与变量②
- Java从入门到“放弃”(精通)之旅——运算符③
- Java从入门到“放弃”(精通)之旅——程序逻辑控制④
- Java从入门到“放弃”(精通)之旅——方法的使用⑤
- Java从入门到“放弃”(精通)之旅——数组的定义与使用⑥
- Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦
- Java从入门到“放弃”(精通)之旅——继承与多态⑧
- Java从入门到“放弃”(精通)之旅——抽象类和接口⑨
- Java从入门到“放弃”(精通)之旅——String类⑩
相关文章:
Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
Java从入门到“放弃”(精通)之旅🚀——JavaSE终篇(异常) 一、异常的概念与体系结构 1.1 什么是异常? 在生活中,当一个人表情痛苦时,我们可能会关心地问:"你是不是生…...
TCP协议理解
文章目录 TCP协议理解理论基础TCP首部结构图示字段逐项解析 TCP是面向连接(Connection-Oriented)面向连接的核心表现TCP 面向连接的核心特性TCP 与UDP对比 TCP是一个可靠的(reliable)序号与确认机制(Sequencing & Acknowledgment…...
NS3-虚拟网络与物理网络的交互-1 仿真概述
NS3-虚拟网络与物理网络的交互-1 仿真概述 目录 1. 仿真概述1.1 Testbed 仿真示例-FdNetDevice1.2 模拟通道示例-TapDevice 1. 仿真概述 NS-3 专为集成到 TestBed 和虚拟机中而设计 环境。我们通过提供两种网络设备来满足这一需求。 第一种设备是文件描述符 net 设备 &#x…...
晶振老化:不可忽视的隐患与预防策略
在电子设备的世界里,晶振如同精准的时钟,为电路系统提供稳定的频率信号。然而,随着时间推移,晶振会不可避免地出现老化现象。这个看似细微的变化,却可能引发设备性能下降、数据传输错误等一系列问题。晶振老化究竟藏着…...
企业为何要禁止“片断引用开源软件代码”?一文看透!
开篇故事:一段“开源代码”引发的百亿级灾难 某电商平台为快速上线新功能,从GitHub复制了一段“高性能加密算法”代码到支付系统中。 半年后,黑客通过该代码中的隐藏后门,盗取百万用户信用卡信息。 事后调查:这段代…...
测试模版x
本篇技术博文摘要 🌟 引言 📘 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮,一名什么都会一丢丢的网络安全工程师,也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...
deepseek-r1-671B满血版,全栈式智能创作平台 - 多模态大模型赋能未来创作
引领AI创作新纪元 比象AI全栈式智能创作平台是基于全球领先的多模态大模型技术构建的新一代AI创作引擎,集成了前沿的BeyondLM-7B认知计算框架、BeyondDiffusion-XL视觉生成系统和BeyondSynth音视频合成技术,打造从内容构思到成品输出的完整智能创作闭环…...
Promethues 普罗米修斯
Prometheus 并非传统意义上的数据库,而是一个开源的系统监控和报警工具包,但它的核心组件之一是时间序列数据库,用于存储监控指标数据。以下是对 Prometheus 及其时间序列数据库功能的详细介绍: 1. Prometheus 概述 目标定位&a…...
Web 服务架构与技术组件概述
目录 web服务流程图 Web 服务流程图描述了客户端与服务器之间的交互。首先,用户通过浏览器发送请求到 Web 服务器。如果请求的是静态资源(如 HTML、CSS、图片),Web 服务器直接返回响应;如果是动态资源,We…...
华硕NUC产品闪耀第31届中国国际广播电视信息网络展览会
2025年4月22日,第31届中国国际广播电视信息网络展览会在北京国家会议中心盛大开幕。作为一年一度的行业盛会,展会汇聚了来自全球各地的顶尖技术与设备厂商。在这片科技与创新交织的海洋中,华硕NUC以其卓越性能、小巧体积和创新技术十分引人注…...
Matplotlib高阶技术全景解析(续):动态交互、三维可视化与性能优化
目录 编辑 一、动态可视化:实时数据流与动画生成 1. 实时数据流可视化 2. 复杂动画控制 二、三维可视化:科学计算与工程建模 1. 基础三维绘图 2. 高级三维渲染优化 三、交互式可视化:GUI集成与Web部署 1. Tkinter/PyQt嵌入式开发 …...
[DDD传灯录]禅师:这,就是领域驱动设计(01-02)
用《软件方法》引领AI全流程开发-5月12-14日第3期 领域驱动设计是革命性的创造,是划时代的洞见,是解决业务领域用户需求技术系统功能逻辑架构分析设计复杂性的敏捷精益方法学。 这一切的根源,归结于领域驱动设计蕴含丰富的佛学思想。佛学是所…...
0基础 | Proteus仿真 | 51单片机 | 继电器
继电器---RELAY 本次选择一款5v一路继电器进行讲解 信号输入 IN1输入高电平,三极管导通,LED1点亮,电磁铁12接通吸引3向下与4接通,J1A的12接通 IN1输入低电平,则J1A的23接通 产品引脚定义及功能 序号 引脚符号 引脚…...
鸿蒙应用开发证书考试的一点想法
一、介绍: 直接上图 二、体验后的想法: 1.知识点在指南API参考最佳实践里面找 2.没有明确说明考试不能查第1点的文档,但是考试只有1个小时,合理分配时间 3.切屏三次后自动提交要注意,每月3次机会下月又有3次机会&a…...
MiniMind模型的web交互功能初试
MiniMind模型的web交互功能初试 一、前言 MiniMind提供了基于streamlit的web交互功能,能够即时切换模型和修改相关参数,经初步测试,具有比较好的体验感。本文介绍了使用MiniMind使用web交互功能的方法,并对使用中出现的问题给出…...
手把手玩转 JSON:快递包裹式思维拆箱装箱,Python / Java / Scala 全景实战指南
在日常开发中,JSON 就像全栈程序员口袋里那把万用螺丝刀——既轻便又几乎无处不在。本文面向初学者和中级读者,用“快递包裹”与“便签盒子”的比喻,结合 Python / Java / Scala 三语种示例,带你从概念、语法到实战全面掌握 JSON。…...
HFSS5(李明洋)——设置激励(波端口激励)
Magnetic是适用于铁磁氧导体的,只有前三种激励类型可以用于计算S参数 1波端口激励 也可以设置在模型内部,如果是设置在模型内部必须加一段理想导体,用于指定端口方向 1.1——模式 number 输入N:计算1-N的模式都计算 1.2——模式校准 计算端口特征阻抗有三种方式:Zpi、…...
NVIDIA --- 端到端自动驾驶
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、传统驾驶模型二、NVIDIA的端到端驾驶模型1.基本模型2.自查讯向量3.通用框架 总结 前言 端到端自动驾驶指的是系统接收来自摄像头雷达和激光雷达的原始传感…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(11): てあります。
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(11): てあります。 1、前言(1)情况说明(2)工程师的信仰 2、知识点(1)てあります。(2)…...
【前端】如何检查内存泄漏
在实际的场景中,如果观察到内存持续出现峰值,并且内存消耗一直没有减少,那可能存在内存泄漏。 使用 Chrome DevTools 来识别内存图和一些内存泄漏,我们需要关注以下两个方面: ● 使用性能分析器可视化内存消耗…...
【多线程】四、死锁
文章目录 Ⅰ. 死锁的概念Ⅱ. 死锁的四个必要条件Ⅲ. 避免死锁的方案Ⅳ. 避免死锁的算法Ⅰ. 死锁的概念 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。 通常,死锁发生在多个进程同时需要…...
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
Video-LLaVA
一、研究背景与现有方法局限性 在多模态大语言模型(LVLMs)的发展中,现有方法面临两大核心挑战。其一为单一模态处理的局限,多数 LVLMs 仅能处理图像 - 语言或视频 - 语言等单一视觉模态,难以在统一框架下高效整合多种视觉输入。其二为统一表示的困难,尽管部分研究尝试通过…...
firewalld 详解
firewalld 详解 firewalld 是 Linux 系统中一个动态防火墙管理工具,取代了传统的 iptables,提供更灵活、动态的规则配置,支持运行时修改且无需重载服务。以下是其核心概念、常用操作及示例指南: 一、核心概念 区域(Zo…...
QuecPython+USBNET:实现USB网卡功能
USBNET 概述 USBNET(USB Networking) 是一种通过 USB 接口 实现网络通信的技术,允许设备通过 USB 连接模拟以太网(Ethernet over USB)或直接进行网络数据传输。它广泛应用于嵌入式设备、工业控制、虚拟机和便携式设备…...
百度搜索AI开放计划:助力开发者通过MCP Server连接用户和应用
百度搜索AI开放计划:助力开发者通过MCP Server连接用户和应用 一、背景 2025年4月25日,百度在Create开发者大会上发布了全新的AI开放计划。这一计划的核心目的是实现用户和AI应用、MCP Server的高效链接,提供更流畅的互动体验,推…...
一文带你了解单例模式及其逐步优化~
单例模式 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。 使用场景: 需要频繁创建和销毁的对象 创建对象时耗时过多或资源消耗过大 工具类对象(无状态的工具类) 访问…...
【金仓数据库征文】-不懂数据库也能看懂!一文解析金仓技术介绍以典型应用
目录 一、主角登场 没有数据库,你的生活可能会 “乱套” 国产数据库之金仓 KingbaseES 金仓数据库凭啥 “C 位出道”? 二、金仓数据库产品核心解析 企业级数据库 “全能选手” 巧妙的 “内部协作” 按需选择的版本 四、生态联合解决方案深度探索…...
什么是视频上墙
视频联动上墙是指当监控系统中出现报警或其他特定事件时,相关的视频画面能够自动切换并显示在指定的监控大屏或显示设备上,以便监控人员能够快速、直观地查看事件现场的情况,及时做出响应和处理。 具体介绍• 系统组成 :一般由前端…...
C++初登门槛
多态 一、概念 多态是指不同对象对同一消息产生不同响应的行为。例如,蓝牙、4G、Wi-Fi 对“发送数据”指令有不同的具体实现。 二、核心理解 本质:通过基类指针或引用操作子类对象,实现运行时动态绑定。 表现形式: 接口统一&a…...
【金仓数据库征文】- 金融HTAP实战:KingbaseES实时风控与毫秒级分析一体化架构
文章目录 引言:金融数字化转型的HTAP引擎革命一、HTAP架构设计与资源隔离策略1.1 混合负载物理隔离架构1.1.1 行列存储分区策略1.1.2 四级资源隔离机制 二、实时流处理与增量同步优化2.1 分钟级新鲜度保障2.1.1 WAL日志增量同步2.1.2 流计算优化 2.2 物化视图实时刷…...
SpringBoot 学习
什么是 SpringBoot SpringBoot 是基于 Spring 生态的开源框架,旨在简化 Spring 应用的初始化搭建和开发配置。它通过约定大于配置的理念,提供快速构建生产级应用的解决方案,显著降低开发者对 XML 配置和依赖管理的负担。 特点: …...
Q2桥门式起重机司机考试复习重点
Q2桥门式起重机司机考试复习重点 Q2桥门式起重机司机属于特种设备作业人员,理论考试重点复习时应重点掌握以下内容: 1、基础知识 桥门式起重机的结构组成(大车、小车、起升机构、电气系统等)。 主要技术参数(额定起…...
并发设计模式实战系列(7):Thread Local Storage (TLS)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第七章Thread Local Storage (TLS),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. TLS内存模型 2. 关键特性 二、生活化类比&a…...
本地使用Ollama部署DeepSeek
以下是在本地使用Ollama部署DeepSeek的详细教程,涵盖安装、修改安装目录、安装大模型以及删除大模型的操作步骤。 安装Ollama 1. 系统要求 确保你的系统满足以下条件: 操作系统:macOS、Linux或者Windows。足够的磁盘空间和内存。 2. 安装…...
通过VSCode远程连接到CentOS7/Ubuntu18等老系统
通过VSCode远程连接到CentOS7/Ubuntu18等老系统 背景 VSCode的远程连接插件Remote SSH一直以来是简单好用的远程工具。然而,2025年2月之后的版本在远程安装vscode-server时,预编译的server依赖glibc 2.28,这就要求Linux远程机的glibc版本应…...
Python在AI虚拟教学视频开发中的核心技术与前景展望
Python在AI虚拟教学视频开发中的核心技术与前景展望 一、引言:AI虚拟教学的技术革新 随着教育数字化转型加速,AI虚拟教学视频凭借个性化、沉浸式体验成为教育科技的新风口。Python以其强大的多模态处理能力、丰富的开源生态和跨领域兼容性,成…...
【金仓数据库征文】金仓数据库:开启未来技术脑洞,探索数据库无限可能
我的个人主页 我的专栏: 人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!! 点赞👍收藏❤ 目录 引言:数据库进化的下一站 —— 未来科技的无限可能金仓数据库简介:国…...
深入掌握Redis主从复制:原理、配置与生产级实践指南
一、主从复制核心价值与适用场景 1.1 核心价值矩阵 数据安全:多节点冗余存储,避免单点数据丢失 服务可用性:主节点故障时可快速切换从节点 性能扩展:通过横向扩展从节点提升读吞吐量 运维便利:从节点可承担备份、分…...
springboot如何管理多数据源?
静态多数据源管理 配置多个数据源 :创建多个数据源的配置类,通常使用 @ConfigurationProperties 注解来绑定配置文件中的数据源属性,并通过 @Bean 注解定义多个 DataSource Bean 。例如: 配置类: @Configuration public class DataSourceConfig {@Bean(name = "prima…...
基于风力推进器控制的小球实验装置设计与研究
目录 完整论文下载链接放在文章结尾,有需要自行下载。 目录 摘 要 1 引 言 2 概述 2.1 风控小球系统概述 2.2 本设计方案思路 2.3 研发方向和技术关键 2.4 主要技术指标 3 总体设计 4 硬件设计 4.1 单片机最小系统 4.2 供电接口电路 4.3 Openmv摄像头…...
Swift闭包(Closure)深入解析与底层原理
前言 在Swift开发中,闭包是一个非常重要且强大的特性。本文将深入探讨Swift闭包的底层实现原理,帮助开发者更好地理解和使用这一特性。 1. 什么是闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用。它不仅可以像函数一样执行代码&…...
【DE-III】基于细节增强的模态内和模态间交互的视听情感识别
abstract 在视听情感识别(AVER)中,捕捉视频和音频模态之间复杂的时间关系是至关重要的。然而,现有的方法缺乏对局部细节的关注,如视频帧之间的面部状态变化,这会降低特征的可区分性,从而降低识别准确率。 为此,本文提出了一种用于AVER的细节增强的模态内和模态间交互…...
c++11 :智能指针
目录 一 为什么需要智能指针? 二 智能指针的使用及原理 1. RAII 2. auto_ptr 3. unique_ptr 4. shared_ptr 5. weak_ptr 三 内存泄漏 1.什么是内存泄漏,内存泄漏的危害 2. 如何避免内存泄漏? 一 为什么需要智能指针? …...
Linux解压tar.gz包的正确姿势(附赠防抓狂指南)
一、为什么你的解压命令总报错? 每次看到.tar.gz后缀是不是心里一紧?(别装了!我都看到你偷偷打开浏览器查命令的样子了)这个在Linux界横行霸道的压缩格式,其实用对了方法比Windows的zip还简单。今天咱们不…...
MCP协议:让AI从“话痨”变“实干家”的神奇魔法
一、MCP 协议:AI 界的 “万能插头” 是啥来头? 1.1 从 “动口不动手” 到 “全能打工人” 你以为 AI 只会陪你聊天、写文案?那你可小瞧它啦!MCP 协议(Model Context Protocol),堪称 AI 的 “瑞…...
如何在SpringBoot中通过@Value注入Map和List并使用YAML配置?
在SpringBoot开发中,我们经常需要从配置文件中读取各种参数。对于简单的字符串或数值,直接使用Value注解就可以了。但当我们需要注入更复杂的数据结构,比如Map或者List时,该怎么操作呢?特别是使用YAML这种更人性化的配…...
记一次调用大华抓拍SDK并发优化
目录 一、问题分析 二、解决思路 三、贴代码 四、总结 一、问题分析 按惯例上问题: 设备告警采用高电平持续模式:一次开,不主动关就一直处于告警状态。 并发时多个请求下发 setDVRAlarmOutConfig,导致状态混乱。 “开 -&g…...
打破认知!没论文没竞赛,我的暑期实习上岸秘籍:简历要敢 “吹”,面试靠巧 “聊”
前言 以下教程仅针对本人的大大小小几十场暑期实习面试的经验总结,个人背景(双9,无论文、无竞赛、无大厂实习、无奖。)。简历几易其稿,相对于原来的初版,可谓是脱胎换骨,洗经易髓。 二月中旬开…...
为何 RAG 向量存储应优先考虑 PostgreSQL + pgvector 而非 MySQL?
构建检索增强生成(RAG)系统已成为释放大型语言模型(LLM)潜力的关键范式。通过将 LLM 的推理能力与外部知识库的实时、特定信息相结合,RAG 能够生成更准确、更相关、更值得信赖的回答。而这个“外部知识库”的核心&…...