当前位置: 首页 > 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;或将业务复杂…...

从GUI到Tcl命令:Vivado Report Timing Summary配置选项的完整对照手册(附常用命令模板)

Vivado时序报告GUI与Tcl命令深度对照手册&#xff1a;打造自动化分析工作流 在FPGA设计流程中&#xff0c;时序分析是确保设计满足性能要求的关键环节。Vivado IDE提供了直观的GUI界面用于配置时序报告&#xff0c;但对于追求高效自动化的工程师而言&#xff0c;掌握底层Tcl命令…...

OpenClaw调试技巧:nanobot镜像的日志分析与问题定位

OpenClaw调试技巧&#xff1a;nanobot镜像的日志分析与问题定位 1. 为什么需要关注OpenClaw日志 上周我在本地部署nanobot镜像时遇到一个诡异现象&#xff1a;OpenClaw能正常接收飞书消息&#xff0c;但执行自动化任务时总在"思考阶段"卡住。这个问题困扰了我两天&…...

Obsidian移动端深度评测:安卓/iOS同步技巧+5个必装生产力插件

Obsidian移动端深度评测&#xff1a;安卓/iOS同步技巧5个必装生产力插件 在移动办公场景下&#xff0c;Obsidian作为一款强大的知识管理工具&#xff0c;其跨平台能力与插件生态为商务人士和学生群体提供了独特的价值。本文将深入解析Obsidian在Android和iOS平台的核心差异&…...

StructBERT-Large中文相似度工具一文详解:三级匹配等级判定逻辑与业务适配建议

StructBERT-Large中文相似度工具一文详解&#xff1a;三级匹配等级判定逻辑与业务适配建议 本文深度解析StructBERT-Large中文相似度工具的核心匹配逻辑&#xff0c;提供实际业务场景中的适配建议和优化方案 1. 工具核心价值与适用场景 StructBERT-Large中文相似度工具是一个基…...

OpenClaw对接GLM-4.7-Flash:模型版本管理指南

OpenClaw对接GLM-4.7-Flash&#xff1a;模型版本管理指南 1. 为什么需要关注模型版本管理 上周我在调试一个自动化文档处理流程时&#xff0c;遇到了一个奇怪的现象&#xff1a;同样的OpenClaw脚本&#xff0c;前一天还能完美运行的文档摘要功能&#xff0c;第二天突然开始输…...

好看不等于会交互!阿里发布基于交互的世界模型基准

视频生成技术正在以惊人的速度迭代&#xff0c;那些光影绚丽的画面常常让人惊叹人工智能的创造力&#xff0c;但当你仔细观察视频中的物理碰撞或物体运动时&#xff0c;会发现它们常常并不符合现实世界的常识。由阿里、中科院、北航和北邮的研究人员联合推出的 Omni-WorldBench…...

02.Linux常用文件操作命令

1.mkdir 目录名:创建目录 mkdir 目录名 mkdir -p a/b/c 创建多级目录 2.touch 创建空文件 touch 文件名 touch 文件名 文件名 创建多个文件 3.文件写入内容 echo写入 覆盖写入 echo 文件内容 >文件名 追加写入&#xff08;日志必用&#xff09; echo 文件内容 >…...

从Address Editor入手:在Block Design中精准调整Bram存储深度的实战解析

1. 当Bram存储深度无法修改时&#xff0c;你该怎么做&#xff1f; 第一次在Vivado中使用Block Design搭建系统时&#xff0c;很多人都会遇到一个奇怪的现象&#xff1a;明明在Bram IP核的参数设置界面看到了"Depth"这个选项&#xff0c;但无论如何点击都无法修改。这…...

3分钟搞定Vue时间轴组件:打造优雅时间线应用的终极指南

3分钟搞定Vue时间轴组件&#xff1a;打造优雅时间线应用的终极指南 【免费下载链接】timeline-vuejs Minimalist Timeline ⏳ with VueJS &#x1f49a; 项目地址: https://gitcode.com/gh_mirrors/ti/timeline-vuejs 还在为Vue项目中的时间线展示而烦恼吗&#xff1f;t…...

像素幻梦·创意工坊应用场景:复古风APP启动页加载动画AI生成方案

像素幻梦创意工坊应用场景&#xff1a;复古风APP启动页&加载动画AI生成方案 1. 引言&#xff1a;像素艺术的复兴与AI赋能 在移动应用设计领域&#xff0c;复古像素风格正经历一场文艺复兴。从独立游戏到主流应用&#xff0c;越来越多的产品选择用像素艺术打造独特的品牌识…...