当前位置: 首页 > news >正文

第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概述&#xff1a; 1&#xff09;、异常的概念&#xff1a; 现实生活中万物在发展和变化会出现各种各样不正常的现象。 例如&#xff1a;人的成长过程中会生病。 实际工作中&#xff0c;遇到的情况不可能是非常完美的。 比如&#xff1a;你写的某个模块&…...

使用python生成一个月度账单消费金额柱状图表

阿里云月度账单根据月份、消费金额&#xff08;可开票&#xff09;生成一个柱状图表 import pandas as pd import matplotlib.pyplot as plt import os# 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] # 用于显示中文的宋体# 获取当前工作目录下所有CSV文件 csv_fil…...

将一个独立的磁盘添加到已有的 `/` 分区

将一个独立的磁盘添加到已有的 / 分区是比较复杂的&#xff0c;因为 / 分区已经是一个逻辑卷&#xff08;LVM&#xff09;。在这种情况下&#xff0c;可以扩展现有的 LVM 体积组&#xff08;Volume Group&#xff09;&#xff0c;然后扩展 / 逻辑卷&#xff08;Logical Volume&…...

AI智能电销器人需要注意哪些问题呢

随着科技的不断发展&#xff0c;人们出行变得越来越方便&#xff0c;市面上很多产品也越来越智能化&#xff0c;高科技的产品不仅改变了我们的生活方式而且也改变了企业的竞争方式&#xff0c;很多的企业尤其是电销行业中的大佬己经意识到了AI电销机器人的好处&#xff0c;因此…...

呼叫中心研究分析:到2027年市场规模预计将达4966亿美元

由于业务运营中以客户为中心的方法的兴起&#xff0c;呼叫中心市场近年来出现了显着增长。随着对客户满意度的日益重视&#xff0c;全球对呼叫中心服务的需求猛增。在本次分析中&#xff0c;我们将从全球和中国的角度审视呼叫中心市场的发展趋势。全球市场&#xff1a; 到 2027…...

工业数据采集分析——工厂大脑 提升综合经济效益

随着企业对数字化的认知越来越清晰&#xff0c;对工业数智化的战略越来越明确&#xff0c;企业的诉求也在发生转变。中国的工业企业经过近几十年的发展&#xff0c;自动化、信息化&#xff0c;以及一些基础的数据系统建设在不同的行业中慢慢地推进。近几年&#xff0c;工业企业…...

python系列教程218——生成器表达式

朋友们&#xff0c;如需转载请标明出处&#xff1a;https://blog.csdn.net/jiangjunshow 声明&#xff1a;在人工智能技术教学期间&#xff0c;不少学生向我提一些python相关的问题&#xff0c;所以为了让同学们掌握更多扩展知识更好地理解AI技术&#xff0c;我让助理负责分享…...

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框架是大同小异的&#xff0c;但是难点在于编译项目上面&#xff0c;所以现在记录一下编译的过程。下面图是我项目的目录。其中include放的是头文件&#xff0c;src放的是视图文件&#xff0c;static放的是…...

x-cmd pkg | busybox - 嵌入式 Linux 的瑞士军刀

目录 简介首次用户功能特点竞品和相关作品 进一步阅读 简介 busybox 是一个开源的轻量级工具集合&#xff0c;集成了一批最常用 Unix 工具命令&#xff0c;只需要几 MB 大小就能覆盖绝大多数用户在 Linux 的使用&#xff0c;能在多款 POSIX 环境的操作系统&#xff08;如 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提到需要的软件&#xff1a; Python 3.7 (64-bit) or later Tesseract 4.0 or later Ghostscript 9.50 or later 安装 ocrmypdf pip install ocrmypdf 添加语言包 https://oc…...

卷积神经网络|猫狗分类系列--导入kaggle猫狗数据集

解决任何真实问题的重要一步是获取数据&#xff0c;Kaggle提供了大量不同数据科学问题的竞赛。 我们将从 https://www.kaggle.com/competitions/dogs-vs-cats/data 下载猫狗数据集&#xff0c;并对其进行一定的操作&#xff0c;以正确的导入到我们的计算机&#xff0c;为接下…...

【linux 多线程并发】线程本地数据存储的两种方式,每个线程可以有同名全局私有数据,以及两种方式的性能分析

线程本地数据(TLS) ​专栏内容&#xff1a; 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构&#xff0c;以及如何实现多机的数据库节点的多读多写&#xff0c;与传统主备&#xff0c;MPP的区别&#xff0c;技术难点的分析&#xff0c;数据元数据同步&#xff0c;多主节点的…...

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 内置了一个限流功能的过滤器工厂&#xff0c;那就是RequestRateLimiterGatewayFilterFactory &#xff0c;它使用 Redis 和 Lua 脚本实现令牌桶…...

打印日期c++

给出年份 y和一年中的第 d天&#xff0c;算出第 d天是几月几号。 输入格式 输入包含多组测试数据。 每组数据占一行&#xff0c;包含两个整数 y 和 d。 输出格式 每组数据输出一行一个结果&#xff0c;格式为 yyyy-mm-dd。 数据范围 输入最多包含 100 组数据, 1≤y≤3000, 1≤d…...

数据结构入门到入土——链表(1)

目录 一&#xff0c;顺序表表/ArrayList的缺陷 二&#xff0c;链表 三&#xff0c;链表的实现 四&#xff0c;与链表有关的题目练习&#xff08;1&#xff09; 1.删除链表中等于给定值 val 的所有节点 2.反转一个单链表 3.给定一个带有头结点 head 的非空单链表&#xf…...

MySQL C API的使用

MySQL C API的使用 介绍及使用 MySQL C API&#xff08;也称为 MySQL Connector/C&#xff09;是用于与 MySQL 数据库交互的 C 语言 API。它提供了一组函数和结构体&#xff0c;允许你在 C 程序中连接到 MySQL 数据库服务器&#xff0c;并执行查询、插入、更新等数据库操作。…...

JavaScript防御性编程

简单聊一下防御性编程&#xff0c;初衷是开发人员为了防止自己被裁员&#xff0c;而将代码编写为只有自己能看懂。如何只有自己能看懂&#xff1f;方法多种多样&#xff0c;但不能将简单问题复杂化&#xff0c;比如&#xff1a;编写一堆无效的逻辑关系&#xff0c;或将业务复杂…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...