【Java学习笔记】异常

article/2025/7/6 9:20:55

异常(Exception)

一、基本介绍

在 Java 程序中,将运行中发生的不正常情况称为 “异常”,开发过程中的语法错误和运行时发生的异常情况是不一样的。

二、异常的分类

三、处理异常的方法

四、异常体系图(重点!!)

异常体系图体现了继承关系

请添加图片描述

说明

五、throwsthrow 的区别


一、编译异常

(1)介绍:编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译

(2)常见的编译异常


二、运行异常

(1)介绍:在编译时不会发现,在程序运行时出现的逻辑错误导致的异常,若不做处理,默认抛出(throws)异常,交给 父类 或 上一级 来处理

(2)常见类型

异常演示

(1)NullPointerException:空指针异常

public class NullPointerException_ {public static void main(String[] args) {String name = null;System.out.println(name.length());}
}

异常:获取空字符窜的长度

(2)ArithmeticException:数学运算异常

public class ArithmeticException_ {public static void main(String[] args) {int a = 1;int b = 0;System.out.println("a / b = " + a / b);}
}

异常:分母为 0

(3)ArrayIndexOutOfBoundsException:数组下标越界异常

public class ArrayIndexOutOfBoundsException_ {public static void main(String[] args) {int[] arr = {1, 2, 3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}}
}

异常:数组只有三个元素,却访问了第四个元素

(4)ClassCastException:类型转换异常

public class ClassCastException_ {public static void main(String[] args) {person p_a = new A(); // 向上转型A a = (A)p_a; // 向下转型// 两个不相关的类进行转换会报异常B b = (B) p_a; // A 和 B 之间无关系,不可以把指向 A 的转换为 B}
}class person {}class A extends person{}class B extends person{}

异常:A 类 和 B 类 没有关系,不可以把指向 A 类 的对象转成指向 B 类 的对象

(5)NumberFormatException:数字格式不正确异常

public class NumberFormatException_ {public static void main(String[] args) {String name = "异常";// 将 String 转成 intint num = Integer.parseInt(name);System.out.println(num);}
}

异常:无法将字符串转化为整数


三、异常处理

1. try - catch - finally

使用方法:选中可能出现异常的代码部分,使用快捷键ctrl + alt + t,在弹窗中选择需要的结构即可

1. 三种结构

2. 基本结构图

请添加图片描述

3. 代码示例

public class main {public static void main(String[] args) {try {String name = "异常";// 将 String 转成 intint num = Integer.parseInt(name);  // 会抛出 NumberFormatExceptionSystem.out.println(num);} catch (NumberFormatException e) {System.out.println(e.getMessage());} finally {System.out.println("程序执行到 finally 部分.....");}}
}

说明:在catch结构中,使用getMessage()方法获取异常信息

4. try - catch结构的使用细节

5. try - finally结构的使用细节

该用法相当于没有捕获异常,因此程序会直接退出==崩掉 / 退出

应用场景:执行一段代码后,不管是否发生异常,都必须执行某个业务逻辑(finally部分的代码)

解释:为什么子类在前,父类在后?

package exception_;public class main {public static void main(String[] args) {try {// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}} catch (NullPointerException e) {System.out.println("空指针异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界异常:" + e.getMessage());}System.out.println("程序继续执行......");}
}// 运行结果
空指针异常:null
程序继续执行......

代码解析

NullPointerException(子类)和ArrayIndexOutOfBoundsException(子类)都是RuntimeException(父类)的子类,然而运行异常又是Exception的子类,如果把父类Exception写在前面,即包含了所有子类,后面再写子类就没有意义了

6. try - catch的练习题

public class ExceptionExe01 {public static int method() {int i = 1;try {i++;String[] names = new String[3];if (names[1].equals("tom")) {System.out.println(names[1]);} else {names[3] = "jack";}return 1;} catch (ArrayIndexOutOfBoundsException e) {return 2;} catch (NullPointerException e) {return ++i;} finally {++i;System.out.println("i = " + i);}}public static void main(String[] args) {System.out.println(method());}
}

程序执行结果

i = 4
3

解释


2. throws

1. 基本介绍:抛出异常

2. 基本原理图

请添加图片描述

3. 代码示例

(1)抛出方法中的异常

public static void method() throws NullPointerException,ArrayIndexOutOfBoundsException{// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}System.out.println("程序继续执行......");
}

(2)抛出方法中的异常的父类

public static void method() throws RuntimeException{// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}System.out.println("程序继续执行......");
}

代码解释

父类:RuntimeException

子类

4. throws 的使用细节

代码解析:子类重写父类方法抛出异常

class a {public void method() throws RuntimeException{// NullPointerExceptionString name = null;System.out.println(name.length());}
}class b extends a {@Overridepublic void method() throws ArrayIndexOutOfBoundsException{// ArrayIndexOutOfBoundsExceptionint[] arr = {1, 2, 3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}}
}

代码解析

b 类是 a 类的子类,则b 类抛出的异常必须是 a 类抛出异常类型的子类,然而 a 类抛出异常的类型NullPointerExceptionRuntimeException子类,抛出的异常类型用其父类代替是没有问题的

但是!!!

若将子类抛出异常的类型换成Exception,必然会报错,因为扩大了父类抛出异常的类型(本质还是继承关系)


3. 自定义异常

1. 基本介绍

程序出现了某些"错误",但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,自定义异常的描述信息

2. 构建方法

3. 应用案例

要求:接收 person 对象年龄时,要求年龄范围在 18 - 120 之间,否则抛出一个自定义异常,并给出提示信息

代码示例

package exception_;public class main {public static void main(String[] args) {int age = 180;if(!(age >= 18 && age <= 120)){throw new AgeException("年龄需要在 18 - 120 之间");}System.out.println("你的年龄范围正确");}
}class AgeException extends RuntimeException {// 调用 RuntimeException 的构造器,修改异常信息public AgeException(String message) {super(message);}
}

输出结果

Exception in thread "main" exception_.AgeException: 年龄需要在 18 - 120 之间at exception_.main.main(main.java:7)

代码解析

思路:创建了一个类,通过调用父类的构造器,在创建自定义异常调用构造器来传入自定义异常信息

如何理解 new?

异常是一个类,抛出的必须是异常类的一个对象实例,所以需要 new,创建对象时通过调用构造器传入信息来完成对象实例的初始化


4. throwsthrow的区别

意义位置后面跟的东西
throws方法声明处异常类型
throw方法体中异常对象

http://www.hkcw.cn/article/nQbpmYyhdS.shtml

相关文章

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— FormWave组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ &#x1f3af; 组件目标 构建一个美观、动态的登录表单&#xff0…

数据库系统概论(十六)数据库安全性(安全标准,控制,视图机制,审计与数据加密)

数据库系统概论&#xff08;十六&#xff09;数据库安全性 前言一、数据库安全性1. 什么是数据库安全性&#xff1f;2. 为何会存在安全问题&#xff1f; 二、安全标准的发展1. 早期的“开拓者”&#xff1a;TCSEC标准2. 走向国际统一&#xff1a;CC标准3. TCSEC和CC标准有什么不…

显示即战略:铁电液晶如何成为 “数字中国” 的 “像素基石”?

一、显示技术&#xff1a;数字时代的核心战略支点 &#xff08;一&#xff09;从 “视觉窗口” 到 “战略基础设施” 在数字经济蓬勃发展的当下&#xff0c;显示技术早已超越了单纯的 “视觉呈现” 范畴&#xff0c;成为连接人与数字世界的关键接口。从智能手机、平板电脑到车…

⚡️ Linux grep 命令参数详解

⚡️ Linux grep 用法及参数详解 &#x1f4d8; 1. grep 简介 grep 是 Linux/Unix 系统中用于文本搜索的命令&#xff0c;其全称为 Global Regular Expression Print&#xff0c;意为全局正则表达式打印器。 它根据给定的 模式&#xff08;pattern&#xff09; 对文件或标准…

Rust 变量与可变性

文章目录 变量与可变性常量遮蔽&#xff08;Shadowing&#xff09; 变量与可变性 Rust中变量默认是不可变的&#xff0c;这是 Rust 鼓励你编写更安全、易于并发代码的众多方式之一。不过&#xff0c;你仍然可以选择让变量可变。让我们来探讨 Rust 为什么鼓励你优先使用不可变性…

YOLOV7改进之融合深浅下采样模块(DSD Module)和轻量特征融合模块(LFI Module)

目录 一、研究背景​ 二. 核心创新点​ ​2.1 避免高MAC操作​ ​2.2 DSDM-LFIM主干网络​ 2.3 P2小目标检测分支​ ​3. 代码复现指南​ 环境配置 关键修改点 ​4. 实验结果对比​ 4.1 VisDrone数据集性能 4.2 边缘设备部署 4.3 检测效果可视化 ​5. 应用场景​ …

(Python网络爬虫);抓取B站404页面小漫画

目录 一. 分析网页 二. 准备工作 三. 实现爬虫 1. 抓取工作 2. 分析工作 3. 拼接主函数&运行结果 四. 完整代码清单 1.多线程版本spider.py&#xff1a; 2.异步版本async_spider.py&#xff1a; 经常逛B站的同志们可能知道&#xff0c;B站的404页面做得别具匠心&…

Qt OpenGL 3D 编程入门

Qt 提供了强大的 OpenGL 集成功能&#xff0c;使得在 Qt 应用中实现 3D 图形变得更加简单。以下是使用 Qt 进行 OpenGL 3D 编程的基础知识。 1. 环境配置 创建 Qt 项目 新建 Qt Widgets Application 项目 在 .pro 文件中添加 OpenGL 模块&#xff1a; qmake QT co…

山东警方:10岁失联男童在河道溺亡 搜救行动告终

6月2日,山东滕州市公安局发布警情通报。5月31日22时35分许,警方接到孔某某报警,称其10岁的外孙赵某某于当天17时许离家后失联。接警后,公安机关迅速调阅监控、走访群众,并联合当地政府和社会救援力量,使用搜救警犬和无人机持续开展搜寻工作。6月2日15时许,在邻村一河道内…

韩国大选目前选情如何 李在明领跑选战

韩国第21届总统选举定于6月3日举行,主要候选人仍在抓紧最后机会展开竞选活动,争取更多选票。此次大选在前总统尹锡悦被弹劾后举行,共有7名候选人登记参选,但其中两人已宣布退选,最终有5名候选人参加角逐。这5名候选人分别是共同民主党候选人李在明、国民力量党候选人金文洙…

【深度学习新浪潮】以Dify为例的大模型平台的对比分析

我们从核心功能、适用群体、易用性、可扩展性和安全性五个维度展开对比分析: 一、核心功能对比 平台核心功能多模型支持插件与工具链Dify低代码开发、RAG增强、Agent自律执行、企业级安全支持GPT-4/5、Claude、Llama3、Gemini及开源模型(如Qwen-VL-72B),支持混合模型组合可…

【JAVA】注解+元注解+自定义注解(万字详解)

&#x1f4da;博客主页&#xff1a;代码探秘者 ✨专栏&#xff1a;《JavaSe》 其他更新ing… ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;作者水平有限&#xff0c;欢迎各位大佬指点&…

unity随机生成未知符号教程

目录 前言方法1方法2脚本后言示例代码 前言 在某些游戏中&#xff0c;有一些让人感到意味不明的未知符号&#xff0c;例如在游戏《巴别塔圣歌》中&#xff0c;就有这样一些能让人在初次就看不懂的未知符号。 或者在其他时候&#xff0c;这些未知符号如果跟粒子系统结合在一起的…

OpenCV——Mac系统搭建OpenCV的Java环境

这里写目录标题 一、源码编译安装1.1、下载源码包1.2、cmake安装1.3、java配置1.4、测试 二、Maven引入2.1、添加Maven依赖2.2、加载本地库 一、源码编译安装 1.1、下载源码包 官网下载opencv包&#xff1a;https://opencv.org/releases/ 以4.6.0为例&#xff0c;下载解压后&…

从Docker拉取镜像一直失败超时解决办法

项目场景&#xff1a; 在ubuntu中&#xff0c;使用docker拉去镜像时&#xff0c;一直超时&#xff0c;拉去失败。 问题描述 原因分析&#xff1a; 国外服务器网络不好导致。 解决方案&#xff1a; 解决方案1 设置国内源 我这边测试&#xff0c;更改以后仍然失败 阿里云提供…

告别printf!嵌入式系统高效日志记录方案

目录 1、分级控制与动态过滤机制 2、异步处理与零拷贝架构 3、跨平台适配层设计 在嵌入式系统开发领域&#xff0c;日志记录系统如同数字世界的黑匣子&#xff0c;承载着系统运行状态的关键信息。传统的printf调试方式虽简单易用&#xff0c;但在处理复杂系统时暴露出效率低…

复变函数 $w = z^2$ 的映射图像演示

复变函数 w z 2 w z^2 wz2 的映射图像演示 复变函数 w z 2 w z^2 wz2 是一个基本的二次函数&#xff0c;在复平面上具有有趣的映射性质。下面我将介绍这个函数的映射特性&#xff0c;并使用MATLAB进行可视化演示。 映射特性 极坐标表示&#xff1a;若 z r e i θ z …

【Redis】Zset 有序集合

文章目录 常用命令zaddzcardzcountzrange && zrevrangezrangebyscorezpopmax && bzpopmaxzpopmin && zpopmaxzrank && zrevrankzscorezremzremrangebyrankzremrangebyscorezincrby 集合间操作交集 zinterstore并集 zunionstore 内部编码应用场…

【AI论文】视觉语言模型中的自我修正推理

摘要&#xff1a;推理视觉语言模型&#xff08;VLMs&#xff09;在复杂的多模态任务上表现出了良好的性能。 然而&#xff0c;它们仍然面临着重大挑战&#xff1a;它们对推理错误高度敏感&#xff0c;需要大量带注释的数据或精确的验证器&#xff0c;并且难以在特定领域之外进行…

正则表达式在Java中的应用(补充)

正则表达式在Java中的应用 Java通过java.util.regex包提供正则表达式支持&#xff0c;核心类包括Pattern和Matcher。Pattern用于编译正则表达式模式&#xff0c;Matcher用于匹配操作。基本语法遵循标准正则规则&#xff0c;如\d匹配数字&#xff0c;\w匹配单词字符。 Pattern…