第7章-第1节-Java中的异常处理
1、异常Exception概述:
1)、异常的概念:
现实生活中万物在发展和变化会出现各种各样不正常的现象。
例如:人的成长过程中会生病。 实际工作中,遇到的情况不可能是非常完美的。
比如:你写的某个模块,用户输入不一定符合 你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据 库的数据,数据可能是空的等。 我们的程序再跑着,内存或硬盘可能满了等等。 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是: Exception , 意思是例外。 这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处 理,安全的退出,而不至于程序崩溃。
2)、实际开发中异常的理解:
实际开发中,异常从面向对象的角度考虑也是一类事物,我们可以向上抽取为异常类。这个异常类可以对一些不正常的现象进行描述,并封装为对象。
2、异常体系:
JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是 派生于 Throwable 类的一个实例。 如果内置的异常类不能够满足需要,还可以创建自己的异 常类。 Thorwable 类(表示可抛出)是所有异常和错误的超类,两个直接子类为 Error ( 错误)和 Exception ( 异常)。
先来看看 java 中异常的体系结构图解:
1)、Error类:
Error是 java 所有错误类的父类,描述了 java 运行时系统内部错误和资源耗尽错误。这 类错误是我们无法控制的,同时也是非常罕见的错误,表明系统 JVM 已经处于不可恢复的崩 溃状态中,它是由 JVM 产生和抛出的,比如 OutOfMemoryError 、 ThreadDeath 等。 所以错误是很难处理的,一般与硬件及运行实际环境有关,一般来说程序员是无法处理这些错 误的,我们在编程中,可以不去处理这类错误。 例如内存溢出,需要的内存超出了 java 虚拟机管理的内存范围
//递归模拟内存溢出
public class Test01 {public static void main(String[] args) {A(0);}
}public static void A(int num){num += 1;A(num);
}
Error与Exception的区别:
Error错误,就好像我们开车去上班,结果半路车坏了,那么这种问题我们是没办法提前预知道的
Exception 就好像,我们开车去上班,我们广播中已经提示了A路线堵车,那么我们就可以换条路线即可。
2)、Exception类:
Exception 类所有异常类的父类,其子类对应了各种各样可能出现的异常事件。 Error 是程序无法处理的错误,但是 Exception 是程序本身可以处理的异常,在程序中应当尽可能去处理这些异常。
3)、运行时异常RuntimeException:
RuntimeException 和 他 的 所 有 子 类 异 常,都 属 于 运 行 时 期 异 常 。
例如: NullPointerException 、 ClassCastException 、 IndexOutOfBoundsException 、 ArithmeticException 等。 因为程序编译时异常不能被检查出,所以又称为 不检查异常 ( UnCheckedException ) 。 运行时异常一般是由程序逻辑错误引起的,所以在编写程序时,我们应该从逻辑角度尽可能避 免这类异常的发生。 当出现 RuntimeException 的时候,系统将自动检测并将它们交给缺省的异常处理程序(虚 拟 机 接 管 并 处 理 ) , 用 户 可 以 不 必 对 其 处 理 。
比 如 : 我 们 从 来 没 有 人 去 处 理 过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 ArithmeticException 异常,异常算术条件时抛出。 例如: “ 除以零 ” 的整数会抛出此类的一 个实例。
//空指针异常
public class Test01 {public static void main(String[] args) {int [] nums = null;System.out.println(nums.length);}
}
4)、编译时异常:
要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常
public class BianYiDemo {public static void main(String[] args) throws ParseException {String str = "2022-07-09";SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");Date date = format.parse(str);System.out.println(date);}
}
3、异常处理
1)、throws抛出异常:
public static void main(String[] args)throws ParseException{B(); //此处爆出红线
}public static void B() throws ParseException{Date parse = new SimpleDateFormat("yyyy-MM-dd").parse("2024-01-05 00:00:00");System.out.println(parse);
}
throws 关键字表示,抛出异常,跟在方法后,后可跟多个异常,当前虽然可以抛出不处理,抛出异常的方法被调用处,还是要处理!
【注意】
throws虽然抛出异常,当前代码块中的红线消失可以运行,但是如果代码逻辑或者数据错误,还是会爆出异常,这是因为,throws是负责将异常向上抛出,谁调用此方法谁就负责处理这个异常,那么此处的main方法将异常继续向上抛出,那么main方法是JVM调用的,所以就相当于异常抛给了JVM,然而JVM没有处理这个异常,所以异常信息还是会打印出来!
2)、try-catch捕获异常:
public static void main(String[] args) {try { // try块可能为出现异常的代码段B();} catch (ParseException e) { // catch 块为捕获异常(要捕获的异常类型)//处理异常的方式System.err.println("您的时间格式错误!请修正!!");}
}public static void B() throws ParseException {Date parse = new SimpleDateFormat("yyyy-MM-dd").parse("2024=01-05 00:00:00");System.out.println(parse);
}
try块表示发生异常的代码;
catch表示捕获异常,随后打印异常信息,也可以继续向上抛出!
3)、try-catch-finally:
try catch 后还可接finally块,而finally块中代码无论异常是否发生,都会执行!!常用于关闭资源等操作!
public static void main(String[] args) {try {C();} catch (ArithmeticException e) {System.err.println("分母为0了!!!!快去检查!!!!!");}finally {//常常用于关闭关键资源System.out.println("我是 finally 数据块!,如果出现异常,那就让我关闭数据库资源!");}
}//定义一个方法 模拟分母为0的异常情况
public static void C() throws ArithmeticException {int num1 = 10;int num2 = 0;System.out.println("我正常打开了数据库资源!!!!");System.out.println(num1/num2);System.out.println("我正常关闭数据库资源!!!!");
}
【思考】
1>、如果 异常没有抓住 或者 没有出现异常 的情况下,finally 还会执行嘛? 都会执行
2>、如果 遇见return 关键字,那么finally 还会执行嘛? finally 不会收到return影响的!
【finally块不会被执行的情况】有4种特殊情况,finally块不会被执行:
1>、finally语句块中发生了异常 (中断了)
2>、前面的代码中执行了System.exit()退出程序
3>、程序中所在的线程死亡
4>、关闭CPU
4)、try-finally:
不去处理异常,但是finally还是会执行
try {C();
} finally {//常常用于关闭关键资源System.out.println("我是 finally 数据块!我关闭数据库资源!");
}
//....
5)、getMessage和e.PrintStackTrace区别:
try {C();
} catch (ArithmeticException e) {System.err.println("分母为0了!!!!快去检查!!!!!");//System.out.println(e.getMessage());e.printStackTrace();
} finally {//常常用于关闭关键资源System.out.println("我是 finally 数据块!我关闭数据库资源!");
}
//.....
getMessage:获取异常简单的描述信息。
语法格式:String msg = exception.getMessage();
PrintStackTrace:打印异常追踪的堆栈信息,比较适合于程序的调试阶段
语法格式:exception.printStackTrace();
6)、throw关键字:
throw关键字为手动抛出异常
通过自己判断出现异常的地方,来手动throw抛出异常,因为是运行时异常,在调用处可以不去处理.
在后面的学习中,我们会慢慢发现,throw通常会提供一种方法的多样性,常常搭配if结构一起使用!
public static void main(String[] args) {try {C();} catch (Exception e) {System.out.println("分母为0!!!");}
}//定义一个方法 模拟分母为0的异常情况
public static void C() {int num1 = 10;int num2 = 2;if(num2==0){throw new ArithmeticException("我是throw关键字 ---> 分母为0啦!");} else {System.out.println(num1/num2);}
}
7)、throw和throws:
不同点:
1>、位置不同。throws用在方法上,后边跟的是异常类,可以跟多个异常类。throw用在方法内,后面跟的是异常对象
2>、功能不同,throws用来声明异常,让调用者只知道该功能可能出现的问题,throws表示出现异常的一种可能性,并不一定会发生这些异常;throw抛出具体的问题对象,执行throw则一定抛出了某种异常对象
相同点:两者都是消极处理异常的方式
4、自定义异常:
1)、定义:继承Throwable或者他的子类Exception的用户自己定义的异常类。前面的内容提到的都是系统有的异常类。
2)、在程序中使用自定义异常的步骤:
-
创建自定义异常类
-
编写异常信息
-
通过throw关键字使用自定义异常类
例如:
class AgeException extends Exception {public AgeException(String message) {super(message);}
}public class Test03 {//用户输入年龄方法public static void input() {Scanner scanner = new Scanner(System.in);System.out.println("请输入姓名:");String name = scanner.next();//接收键盘上姓名的输入System.out.println("请输入年龄:");while (scanner.hasNext()) {//Scanner类中的hasNext()方法可以判断下一个输入是否为整数,整数才会进入到循环体,该程序利用这个特点并且结合if判断语句来控制年龄的输入是否<0try {int age = scanner.nextInt();//接收键盘上年龄的输入if (age < 0) {throw new AgeException("年龄不能为负数");//2、一旦出现年龄输入为< 0的情况,就会通过throw抛出一个AgeException类的对象并且捕获处理}System.out.println("姓名" + name);System.out.println("年龄" + age);break;} catch (AgeException e) {System.out.println(e.getMessage() + "请重新输入:");}}}public static void main(String[] args) {input();}
}
5、final、finally、finalize的区别:
-
final用于声明属性,方法和类,分别表示属性不可交变,方法不可被重写,类不可继承。
-
finally是异常处理语句结构的一部分,表示总是执行。
-
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
本电子书目录:
《Java基础的重点知识点全集》
相关文章:

第7章-第1节-Java中的异常处理
1、异常Exception概述: 1)、异常的概念: 现实生活中万物在发展和变化会出现各种各样不正常的现象。 例如:人的成长过程中会生病。 实际工作中,遇到的情况不可能是非常完美的。 比如:你写的某个模块&…...
使用python生成一个月度账单消费金额柱状图表
阿里云月度账单根据月份、消费金额(可开票)生成一个柱状图表 import pandas as pd import matplotlib.pyplot as plt import os# 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] # 用于显示中文的宋体# 获取当前工作目录下所有CSV文件 csv_fil…...
将一个独立的磁盘添加到已有的 `/` 分区
将一个独立的磁盘添加到已有的 / 分区是比较复杂的,因为 / 分区已经是一个逻辑卷(LVM)。在这种情况下,可以扩展现有的 LVM 体积组(Volume Group),然后扩展 / 逻辑卷(Logical Volume&…...
AI智能电销器人需要注意哪些问题呢
随着科技的不断发展,人们出行变得越来越方便,市面上很多产品也越来越智能化,高科技的产品不仅改变了我们的生活方式而且也改变了企业的竞争方式,很多的企业尤其是电销行业中的大佬己经意识到了AI电销机器人的好处,因此…...
呼叫中心研究分析:到2027年市场规模预计将达4966亿美元
由于业务运营中以客户为中心的方法的兴起,呼叫中心市场近年来出现了显着增长。随着对客户满意度的日益重视,全球对呼叫中心服务的需求猛增。在本次分析中,我们将从全球和中国的角度审视呼叫中心市场的发展趋势。全球市场: 到 2027…...

工业数据采集分析——工厂大脑 提升综合经济效益
随着企业对数字化的认知越来越清晰,对工业数智化的战略越来越明确,企业的诉求也在发生转变。中国的工业企业经过近几十年的发展,自动化、信息化,以及一些基础的数据系统建设在不同的行业中慢慢地推进。近几年,工业企业…...
python系列教程218——生成器表达式
朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow 声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享…...

jquery 实现简单的标签页效果
实现 <!DOCTYPE html> <html> <head><title>jq 实现简单的标签页效果</title><script src"/jquery/jquery-1.11.1.min.js"></script><style>.tab {cursor: pointer;width:100px;height:30px;float:left;text-align…...

C++ Web框架Drogon初体验笔记
这段时间研究了一下C的Web框架Drogon。从设计原理上面来说和Python的Web框架是大同小异的,但是难点在于编译项目上面,所以现在记录一下编译的过程。下面图是我项目的目录。其中include放的是头文件,src放的是视图文件,static放的是…...

x-cmd pkg | busybox - 嵌入式 Linux 的瑞士军刀
目录 简介首次用户功能特点竞品和相关作品 进一步阅读 简介 busybox 是一个开源的轻量级工具集合,集成了一批最常用 Unix 工具命令,只需要几 MB 大小就能覆盖绝大多数用户在 Linux 的使用,能在多款 POSIX 环境的操作系统(如 Linu…...

Java异常简单介绍
文章目录 1. 异常分类和关键字1.1 分类1.2 关键字 2. Error2.1 Error定义2.2 常见的Error2.2.1 VirtualMachineError2.2.2 ThreadDeath2.2.3 LinkageError2.2.4 AssertionError2.2.5 InternalError2.2.6 OutOfMemoryError2.2.6.1 OOM原因2.2.6.2 OutOfMemoryError会导致宕机吗 …...

ocrmypdf_pdf识别
安装 安装说明 https://ocrmypdf.readthedocs.io/en/latest/installation.html#native-windows提到需要的软件: Python 3.7 (64-bit) or later Tesseract 4.0 or later Ghostscript 9.50 or later 安装 ocrmypdf pip install ocrmypdf 添加语言包 https://oc…...

卷积神经网络|猫狗分类系列--导入kaggle猫狗数据集
解决任何真实问题的重要一步是获取数据,Kaggle提供了大量不同数据科学问题的竞赛。 我们将从 https://www.kaggle.com/competitions/dogs-vs-cats/data 下载猫狗数据集,并对其进行一定的操作,以正确的导入到我们的计算机,为接下…...
【linux 多线程并发】线程本地数据存储的两种方式,每个线程可以有同名全局私有数据,以及两种方式的性能分析
线程本地数据(TLS) 专栏内容: 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的…...
2401d,d导入C的问题
原文 D中是否可用仅C头文件库? 在C语言中,我需要这样做: #define STB_DS_IMPLEMENTATION #include "stb_ds.h"在包含h文件前,必须在单个C文件中定义. 在D中试过: enum STB_DS_IMPLEMENTATION 1; import stb_ds;但它不管用.有建议吗?也许使用中间C文件会工作 ,但…...
SpringCloud GateWay实现路由限流
目录 RequestRateLimiterGatewayFilterFactory令牌桶算法实现限流 RequestRateLimiterGatewayFilterFactory Spring Cloud Gateway 内置了一个限流功能的过滤器工厂,那就是RequestRateLimiterGatewayFilterFactory ,它使用 Redis 和 Lua 脚本实现令牌桶…...
打印日期c++
给出年份 y和一年中的第 d天,算出第 d天是几月几号。 输入格式 输入包含多组测试数据。 每组数据占一行,包含两个整数 y 和 d。 输出格式 每组数据输出一行一个结果,格式为 yyyy-mm-dd。 数据范围 输入最多包含 100 组数据, 1≤y≤3000, 1≤d…...

数据结构入门到入土——链表(1)
目录 一,顺序表表/ArrayList的缺陷 二,链表 三,链表的实现 四,与链表有关的题目练习(1) 1.删除链表中等于给定值 val 的所有节点 2.反转一个单链表 3.给定一个带有头结点 head 的非空单链表…...
MySQL C API的使用
MySQL C API的使用 介绍及使用 MySQL C API(也称为 MySQL Connector/C)是用于与 MySQL 数据库交互的 C 语言 API。它提供了一组函数和结构体,允许你在 C 程序中连接到 MySQL 数据库服务器,并执行查询、插入、更新等数据库操作。…...
JavaScript防御性编程
简单聊一下防御性编程,初衷是开发人员为了防止自己被裁员,而将代码编写为只有自己能看懂。如何只有自己能看懂?方法多种多样,但不能将简单问题复杂化,比如:编写一堆无效的逻辑关系,或将业务复杂…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...