Java-Exception
目录
- 异常
- 概念
- Error
- Exception
- 体系图
- 常见运行时异常
- NullPointerException
- ArithmeticException
- ArrayIndexOutOfBoundException
- ClassCastException
- NumberFormatException
- 常见的编译异常
- 异常处理机制
- 自定义异常
- throw和throws对比
异常是Java编程中的常见问题,了解如何处理异常至关重要。本文将介绍Java中异常的基本概念,以及如何捕获和处理它们,以构建健壮的应用程序。
异常
异常是在程序运行过程中发生的错误或意外情况,它可以中断正常的程序流程并引发错误处理机制。
Code:
// 尝试执行可能引发异常的代码
public void divide(){int num1=10;int nums2=0; int result = num1 / num2; // 10/0 直接抛出异常
}
但是在真实的业务中,如果因为一个异常导致整个程序无法继续进行,说明这个程序的健壮性很差,
为了保证程序能够进行,可以使用trye-catch异常处理机制来解决
Code:
public void divide(){try {int num1=10;int nums2=0; int result = num1 / num2; // 10/0 直接抛出异常} catch (ArithmeticException e) {// 捕捉并处理异常System.err.println("发生了算术异常:" + e.getMessage());} // 无论是否发生异常,都会执行的代码块System.out.println("程序执行结束");
}
如果进程异常处理,那么即使程序出现了异常,程序也可以继续进行。
概念
将程序执行中发生不正常的情况成为“异常”(开发过程中出现的语法错误等不是异常)
在执行过程中所发生的异常可以分为两大类:
Error
Jvm无法解决的严重问题,如:
- JVM系统内部出现错误、资源消耗
- StackOverFlow(栈溢出)、OOM(out of memory)等严重错误
Exception
Exception可以分为
- 运行时异常:程序运行过程中,发生异常(空指针、读取不到文件等)
- 编程时异常:编译器检测出来的异常
体系图

常见运行时异常
NullPointerException
空指针异常,通常在尝试访问或操作尚未初始化或已设置为**null**的对象时发生。
Code:
String myString = null;
System.out.println(myString.length()); // 这将引发NullPointerException
ArithmeticException
算数异常,它在进行算术运算(例如除以零)产生无效结果时发生。
Code:
int result = 5 / 0; // 这将引发ArithmeticException(算术异常)
这段代码中,尝试5除以0,从数学上来说是未定义计算公式,因此会引发ArithmeticException异常。
ArrayIndexOutOfBoundException
数组索引越界异常,通常在访问数组中不存在的索引位置而抛出。
Code:
int nums={1,2,3,4};
int value=nums[10];
数组nums有5个元素,索引范围是0~4,但是我们试图访问索引10的元素,这个索引超出了数组的最大范围,
因此抛出ArrayIndexOutOfBoundException异常。
ClassCastException
类型转换异常,通常在一种类型转为不兼容的类型时抛出。
Code:
class Animal {// ...
}class Dog extends Animal {// ...
}class Cat extends Animal {// ...
}public class Main {public static void main(String[] args) {Animal animal = new Dog();Cat cat = (Cat) animal; // 这将引发ClassCastException(类转换异常)}
}
创建了Animal类和两个子类Dog、Cat,我们试图将Dog对象的引用转为Cat类型,这是一种不兼容的类型,
因此抛出ClassCastException异常。
NumberFormatException
数字格式异常,通常在字符串转为数字类型时发生格式错误时抛出
Code:
String invalidNumber = "abc123";
int number = Integer.parseInt(invalidNumber); // 这将引发NumberFormatException(数字格式异常)
我们试图将包含字母字符的字符串"abc123" 转换为整数,这是不合法的数字格式,
因此会引发NumberFormatException(数字格式异常)。
常见的编译异常
SQLException:(SQL异常)它表示在执行SQL语句或与数据库交互的过程中发生了问题或错误。IOException:(输入/输出异常)它表示在读取或写入文件、网络操作或其他I/O相关操作期间发生了问题或错误。FileNotFoundException:(文件未找到异常)FileNotFoundException是IOException的一种子类,表示尝试打开或读取一个不存在的文件时引发的异常。ClassNotFoundException:(类未找到异常)表示在尝试加载类时找不到类定义的情况
异常处理机制
在Java中,异常处理是通过一系列的关键字和机制来实现的。
-
try-catch块:使用 try 和 catch 关键字来捕获和处理异常。异常可能会在 try 块中的代码中抛出,而 catch 块则用于捕获异常并执行相应的处理代码。
try {// 可能会引发异常的代码 } catch (ExceptionType e) {// 处理异常的代码 } -
多重catch两块:一个try块可以有多个catch块,用于捕获不同类型的异常,这样可以根据不同的类型异常执行不同的逻辑。
try {// 可能会引发异常的代码 } catch (ExceptionType1 e1) {// 处理 ExceptionType1 类型的异常 } catch (ExceptionType2 e2) {// 处理 ExceptionType2 类型的异常 } -
finally块:finally块用于包含try-catch块之后,它包含的代码无论是否发生异常都会执行。
try {// 可能会引发异常的代码 } catch (ExceptionType e) {// 处理异常的代码 } finally {// 无论是否发生异常都会执行的代码 } -
throws关键字:throw关键字可以用于在方法中主动引发异常,并不能像try-catch块一样有处理异常的逻辑,通常用于自定义异常或在特定条件下引发异常。
public void someMethod() throws ExceptionType {// 可能会引发异常的代码 }
自定义异常
当程序中出现了某些“错误”,但该类错误信息并没有在Throwable子类中描述处理,这个时候可以自定义异常类,用于描述该错误信息
自定义异常步骤:
-
自定义异常类;如果继承Exception,属于编译类型异常;如果继承RuntimeException,属于运行时异常(通过继承RuntimeException)
public class MyCustomException extends Exception {public MyCustomException() {super();}public MyCustomException(String message) {super(message);}public MyCustomException(String message, Throwable cause) {super(message, cause);} }通过自定义异常类提供多个构造函数,以便能够传递异常消息和可能的原因(
Throwable)。这样可以让您的异常提供更多信息,以便于调试和理解问题。 -
使用自定义类异常,在代码中如果符合自定义异常的条件时,使用throw关键字抛出自定义异常;
public void someMethod() throws MyCustomException {// 某些条件导致自定义异常情况if (someCondition) {throw new MyCustomException("自定义异常消息");}// 其他代码 } -
捕获和处理自定义异常:在应用程序的其他部分,也可以使用 try-catch 块来捕获和处理自定义异常
try {someMethod(); } catch (MyCustomException e) {// 处理自定义异常System.out.println("捕获自定义异常:" + e.getMessage()); }
throw和throws对比
| 意义 | 位置 | 后面根的东西 | |
|---|---|---|---|
| throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
| throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
-
throw:在代码中显示地抛出异常对象,用于指定条件下的异常,throw 后面通常跟着一个异常对象的实例化或引用;
public void someMethod() {if (someCondition) {throw new SomeException("Custom error message");} } -
throws:用于在方法声明中指定该方法可能会抛出的异常类型。
public void someMethod() throws ExceptionType {// 可能会引发异常的代码
}
通过这种方式,您可以更清晰地呈现每个注解的信息和源码分析,使读者更容易理解和学习Java异常的使用。希望这次的修改对您有所帮助!如果需要进一步的修改或补充,请随时提出。
相关文章:
Java-Exception
目录 异常概念ErrorException 体系图常见运行时异常NullPointerExceptionArithmeticExceptionArrayIndexOutOfBoundExceptionClassCastExceptionNumberFormatException 常见的编译异常异常处理机制自定义异常throw和throws对比 异常是Java编程中的常见问题,了解如何…...
C++并发与多线程(2) | 线程运行开始和结束的基本方式
当程序运行起来,生成一个进程,该进程所属的主线程开始自动运行。当主线程从main()函数返回,则整个进程执行完毕。 主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,就代表着我们这个线程运行结束。 整个进…...
vue3前端开发-flex布局篇
文章目录 1.传统布局与flex布局优缺点传统布局flex布局建议 2. flex布局原理2.1 布局原理 3. flex常见属性3.1 父项常见属性3.2 子项常见属性 4.案例实战(携程网首页) 1.传统布局与flex布局优缺点 传统布局 兼容性好布局繁琐局限性,不能再移动端很好的布局 flex布…...
网络是什么?(网络零基础入门篇)
1.如何理解局域网和广域网? 2.路由器和交换机是怎么样工作的? 3.三层交换机能不能代替路由器? -- 局域网 广域网 -- 企业网架构,运营商架构,数据中心架构 -- 局域网 通过 交换机连接的 转发 相同的ip地址…...
【JavaEE】线程安全的集合类
文章目录 前言多线程环境使用 ArrayList多线程环境使用队列多线程环境使用哈希表1. HashTable2. ConcurrentHashMap 前言 前面我们学习了很多的Java集合类,像什么ArrayList、Queue、HashTable、HashMap等等一些常用的集合类,之前使用这些都是在单线程中…...
【C++算法】is_partitioned、partition_copy和partition_point
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、is_partitioned函数:1.1 is_partitioned是什么?1.2 函数原型1.3 示例代码1.4 更多示例代码 二、partition_copy函数2.1 概念2.2 函数…...
MyBatis(JavaEE进阶系列4)
目录 前言: 1.MyBatis是什么 2.为什么要学习MyBatis框架 3.MyBatis框架的搭建 3.1添加MyBatis框架 3.2设置MyBatis配置 4.根据MyBatis写法完成数据库的操作 5.MyBatis里面的增删改查操作 5.1插入语句 5.2修改语句 5.3delete语句 5.4查询语句 5.5like查…...
『力扣每日一题15』:买卖股票的最佳时机
一、题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...
Java中栈实现怎么选?Stack、Deque、ArrayDeque、LinkedList(含常用Api积累)
目录 Java中的Stack类 不用Stack有以下两点原因 1、从性能上来说应该使用Deque代替Stack。 2、Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。 该用ArrayDeque还是LinkedList? ArrayDeque与LinkList区别࿱…...
雷达分辨率单元、单向/双向雷达方程、天气雷达方程简介
一、点状目标 如果两个点状目标在一个分辨率单元中,经典脉冲雷达只能看到一个目标。 点状目标 二、雷达距离分辨率 对于简单的键控开/关脉冲调制: 对于使用脉冲内调制的雷达,距离分辨率取决于压缩脉冲的脉冲持续时间。脉冲压缩比(PCR)取决于传输带宽BWtx,即距离分辨率取…...
RabbitMQ之Fanout(扇形) Exchange解读
目录 基本介绍 适用场景 springboot代码演示 演示架构 工程概述 RabbitConfig配置类:创建队列及交换机并进行绑定 MessageService业务类:发送消息及接收消息 主启动类RabbitMq01Application:实现ApplicationRunner接口 基本介绍 Fa…...
Redisson—分布式集合详述
7.1. 映射(Map) 基于Redis的Redisson的分布式映射结构的RMap Java对象实现了java.util.concurrent.ConcurrentMap接口和java.util.Map接口。与HashMap不同的是,RMap保持了元素的插入顺序。该对象的最大容量受Redis限制,最大元素数…...
开发做前端好还是后端好?这是个问题!
前言 随着互联网的快速发展,越来越多的人选择从事Web开发行业,而Web开发涉及到前端和后端两个方面,相信许多人都曾经对这两个方面进行过探究。而且编程世界就像一座大城市,前端开发和后端开发就像城市的两个不同街区。作为初学者&…...
运行huggingface Kosmos2报错 nameerror: name ‘kosmos2tokenizer‘ is not defined
尝试运行huggingface上的Kosmos,https://huggingface.co/ydshieh/kosmos-2-patch14-224失败,报错: nameerror: name kosmos2tokenizer is not defined查看报错代码: vi /root/.cache/huggingface/modules/transformers_modules/ydshieh/kosmos-2-patch14-224/48e3edebaeb…...
吃鸡玩家必备神器!一站式提升战斗力、分享干货!
大家好,我是吃鸡玩家。在这个视频中,我要分享一个让你瞬间提高战斗力的神器,同时让你享受到顶级游戏作战干货的盛宴!让我们一起来了解吧! 首先,我们推荐绝地求生作图工具。通过这款工具,你可以轻…...
【maven】idea中基于maven-webapp骨架创建的web.xml问题
IDEA中基于maven-webapp骨架创建的web工程,默认的web.xml是这样的。 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name…...
【算法题】2034. 股票价格波动
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一支股票价格的数据流。数据流…...
APSIM模型】作物模型应用案例
APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生长模拟模型之一。APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安…...
io_uring之liburing库安装
手动编译和安装 liburing: 1.首先,从 liburing 的 GitHub 仓库中获取源代码。您可以使用以下命令克隆仓库: git clone https://github.com/axboe/liburing.git2.进入 liburing 目录: cd liburing3.运行configure ./configure …...
Python WebSocket自动化测试:构建高效接口测试框架!
为了更高效地进行WebSocket接口的自动化测试,我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架,并重点关注以下四个方面的内容:运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
