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

【Java零基础入门篇】第 ⑥ 期 - 异常处理


博主:命运之光
专栏:Java零基础入门

 

学习目标

掌握异常的概念,Java中的常见异常类;

掌握Java中如何捕获和处理异常;

掌握自定义异常类及其使用;

目录

异常概述

异常体系

常见的异常

Java的异常处理机制

方式一:try – catch - finally

方式二:throws+异常类型

手动抛出异常

重写方法声明抛出异常的原则

throws和throw的区别:

自定义异常


异常概述

程序员在写代码的时候即便写的尽善尽美,在系统的运行过程中依据会遇到一些问题,因为很多问题不是靠代码能够避免的。

异常体系

🍓🍓异常是处理运行时错误的特殊类,所有异常类都是java.lang.Throwable的子类,Throwable 类是类库java.Lang 包中的一个类,它派生了两个子类:ExceptionError

  • Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。必须修改代码,程序才可以继续执行。
  • Exception其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问、试图读取不存在的文件、网络连接中断、数组下标越界等。

Exception分为:运行时异常(非受检异常);编译时异常(受检异常)

编译时异常:类型上都属于Exception类及其子类。编译时为了保证程序的健壮性 ,可以提前预料到的异常,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过

运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,也会编译通过。

常见的异常

1.ArithmeticException 异常

算术运算异常,当除数为零时就会产生此类异常。

例如:int x=2/0; //此时会发生ArithmeticException异常

2.ArrayIndexOutOfBoundsException异常

访问数组元素的下标越界异常,当访问的数组元素的下标超过数组的上下界时发生此类异常。

例如: int a[]=new int[3]; //定义了数组a,下标从0到2是合法的 int x=a[3]; //下标超过上界,此时会发生ArrayIndexOutOfBoundsException异常

3.ArrayStoreException异常

数组存储异常,当数组存储空间不够或类型不匹配时会产生此类异常。

例如: int a[]=new int[5]; String b=new String[5]; String.arraryCopy(a,b); //类型不匹配会产生ArrayStoreException异常

4. NegativeArraySizeException异常

负值数组大小异常,当数组的存储单元个数为负数时会产生此类异常。例如: int a[]=new int[-5]; //数组个数大小为负数,发生NegativeArraySizeException异常。

5.IndexOutOfBoundsException异常

索引(下标)越界异常,是ArrayIndexOutOfBoundsException的父类。例如: String s=”abc123”; s.charAt(8); // 下标8越界,发生IndexOutOfBoundsException异常

6.NullPointerException异常

访问空引用(指针)异常。例如: String s=null; s.charAt(2); //s为null,发生NullPointerException异常

7. NumberFormatException异常

数值格式异常,当数据类型格式转换不匹配时会产生此类异常。

8. ClassCaseException异常

类强制转换异常,当把一个类强制转换成另一个没有任何继承关系的类时产生此类异常。

9. StringIndexOutOfBoundsException异常

字符串下标越界异常。

10. SecurityException异常

安全性异常。

Java的异常处理机制

🍓🍓在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时,要检测分母为0,数据为空,输入的不是数据而是字符等。

🍓🍓Java中针对各种运行错误定义了很多异常类每个异常类都代表了一种运行错误。每当java程序运行过程中某段代码发生一个可识别的运行错误时,JVM都会产生一个相应的异常类的对象对象封装了异常的有关信息

Java提供的异常处理机制是采取抛出异常,然后捕获异常的处理形式,主要分为两个步骤:

  • 抛出异常:在程序运行中当语义规则被违反时,在异常代码处即产生一个异常事件,生成一个对应异常类的对象,将此对象抛出(throw) ,其后的代码不再处理。
  • 捕获异常:如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常

如果一个异常回到main()方法,并且main()也不处理,则程序运行终止;

程序员通常只能处理Exception,而对Error无能为力.

方式一:try – catch - finally

语法格式:

try {// 有可能出现异常的语句
} catch (异常类型1 对象) {// 异常处理 ;
} catch (异常类型2 对象) {// 异常处理 ;
} catch (异常类型3 对象) {// 异常处理 ;
} ....
finally {//不管是否出现异常,都执行的统一代码
}

🍓🍓例1:直接使用对应异常类作为参数(try – catch - finally)。

public class text1 {public static void main(String args[]) {System.out.println("1、除法计算开始。");try {System.out.println("2、除法计算:" + (10 / 0));	// 此处产生异常// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行System.out.println("异常产生后的语句");} catch (ArithmeticException e) {		// 处理算术异常System.out.println("******** 出现异常了 *********");}System.out.println("3、除法计算结束。");}
}

说明:

  • try: 捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现异常的代码 放在try语句块中,一旦出现异常,就会生成一个对应异常类的对象;
  • catch (Exceptiontype e): catch语句块中是对异常对象进行处理的代码。每个try 语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
  • 如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类作为catch的参数。
    • 比 如 : 可以用 ArithmeticException 类(子类)作为参数的地方,就可以用 RuntimeException类(父类)作为参数,或者用所有异常的父类Exception类作为参数。

🍓🍓例2:使用异常类对应的父类作为参数(try – catch - finally)。

public class text1 {public static void main(String args[]) {System.out.println("1、除法计算开始。");try {System.out.println("2、除法计算:" + (10 / 0));	// 此处产生异常// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行System.out.println("异常产生后的语句");} catch (RuntimeException e) {		// 处理算术异常System.out.println("******** 出现异常了 *********");}System.out.println("3、除法计算结束。");}
}

注意:

  • 一旦try中的异常对象匹配到某一个catch时,进入catch中进行异常的处理,一旦处理完成,跳出try-catch结构(没写finally的情况),继续执行其它代码;
  • finally: 捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。
    • 不论在try代码块中是否发生了异常事件,catch语句是否执行,catch语句是否有异常,catch语句中是否有return,finally块中的语句都会被执行。
    • finally语句和catch语句是任选的。
  • 🍓catch中的异常类型如果没有子父类关系,则声明顺序没有要求,谁在上均可。
  • 🍓catch中的异常类型如果有子父类关系,则子类声明必须在父类声明之上否则报错

捕获异常的有关信息:

与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法

  • getMessage() :获取异常说明信息,返回字符串
  • printStackTrace() :输出异常类名和异常信息,以及异常出现在程序中的位置。返回值void

🍓🍓例3:输出异常完整信息。

public class text1 {public static void main(String args[]) {System.out.println("1、除法计算开始。");try {System.out.println("2、除法计算:" + (10 / 0));// 此处产生异常// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行System.out.println("若前面代码出现异常,此行代码不会执行!");} catch (ArithmeticException e) {	// 处理算术异常e.printStackTrace();	// 输出异常的完整信息} finally {System.out.println("### 不管是否出现异常我都执行!") ;}System.out.println("3、除法计算结束。");}
}

方式二:throws+异常类型

🍓🍓Java中允许在方法的后面使用throws关键字对外声明该方法有可能发生的异常,但此方法中不处理异常。

🍓🍓这样调用者在调用方法时,就明确地知道该方法可能有异常,并且必须在程序中对异常进行处理,否则编译无法通过。

throws关键字声明抛出异常的语法格式如下:

修饰符 返回值类型 方法名(参数列表) throws 异常类型列表{………
}

🍓🍓例:class MyMath

声明如下方法可能会抛出一个ArithmeticExcption或IOException类型的异常,使它的调用者知道要捕获这个异常。

class MyMath {public static int div(int x, int y) throws ArithmeticException, IOException {// 此方法不处理异常return x / y;}
}

🍓“throws + 异常类型”写在方法声明处,指明此方法执行时,可能会抛出的异常类型,一旦方法体执行时,出现异常,仍会在代码处生成一个异常的对象。此对象满足throws后的异常类型时,该对象就会被抛出。

🍓主方法也可以使用throws抛出异常,这时主方法里可以不用强制进行异常处理,而是将异常处理交给JVM进行默认处理,此时会导致程序中断。(不建议使用

手动抛出异常

🍓🍓Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要使用人工创建并抛出

手动创建并抛出异常,通过throw关键字。

throw语句用来直接抛出一个异常,后接一个可抛出的异常类对象

格式如下:

throw new 异常类名(【参数列表】);

异常类名 对象名 =new 异常类名(【参数列表】);
throw 对象名;

例如:首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)

IOException e = new IOException( );throw e;

或:

throw new IOException();

说明:

  • 可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:throw new String("want to throw");

重写方法声明抛出异常的原则

  • 一个方法被覆盖时,覆盖它的方法必须抛出跟被覆盖的方法相同的异常或者异常的子类,或者不抛出异常;
  • 如果父类抛出多个异常,那么重写(覆盖)的方法必须抛出那些异常的一个子集,也就是说不能抛出新的异常。

throws和throw的区别:

  • 首先throws出现在方法函数头(声明处),表示若抛出异常,由该方法的调用者来处理;
  • throw出现在函数体,表示在方法中手工抛出一个异常。

自定义异常

🍓🍓创建用户定义的异常类,可通过扩充(继承)Exception类创建自己的异常类,被扩充的异常类继承Exception类的属性和方法,具有异常类全部特性,同时也和任何其他类一样,可以有数据成员、构造方法及其他功能性的成员方法

自定义异常类后,创建异常类对象,最后再使用throw语句抛出该异常对象,在调用点添加异常处理语句即可。

自定义异常步骤

第1步:自定义异常类。例如:

class MyException extends Exception {……
}

第2步:定义异常对象,并抛出该对象。

式1:

throw new MyException ( );

方式2:

MyException e = new MyException( );
throw e;

相关文章:

【Java零基础入门篇】第 ⑥ 期 - 异常处理

博主:命运之光 专栏:Java零基础入门 学习目标 掌握异常的概念,Java中的常见异常类; 掌握Java中如何捕获和处理异常; 掌握自定义异常类及其使用; 目录 异常概述 异常体系 常见的异常 Java的异常处理机制…...

计算职工工资

目录 问题描述 程序设计 问题描述 【问题描述】 给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。 【输入形式】 输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,…...

2019年上半年软件设计师下午试题

试题四(共 15 分) 阅读下列说明和 C 代码,回答问题 1 至 3,将解答写在答题纸的对应栏内 【说明】 n 皇后问题描述为:在一个 n*n 的棋盘上摆放 n 个皇后,要求任意两个皇后不能冲突, 即任意两个皇后不在同一行、同一列或者同一斜…...

IS200TPROH1BCB用于工业应用和电力分配等。高压型隔离开关用于变电站

​ IS200TPROH1BCB用于工业应用和电力分配等。高压型隔离开关用于变电站 什么是隔离器,它与断路器有何不同 什么是隔离器,为什么要使用隔离器 隔离器是一种开关装置,它可以手动或自动操作,隔离一部分电能。隔离器可用于在无负载情…...

【MySql】数据库 select 进阶

数据库 数据库表的设计ER 关系图三大范式 聚合函数与分组查询聚合函数 (count、sum、avg、max、min)分组查询 group by fields....having....(条件) 多表联查内连接外连接(左连接,右连接)自连接子查询合并查询 UNION 数据库表的设计 ER 关系…...

CVPR 2023 | VoxelNeXt实现全稀疏3D检测跟踪,还能结合Seg Anything

在本文中,研究者提出了一个完全稀疏且以体素为基础的3D物体检测和跟踪框架VoxelNeXt。它采用简单的技术,运行快速,没有太多额外的成本,并且可以在没有NMS后处理的情况下以优雅的方式工作。VoxelNeXt在大规模数据集nuScenes、Waymo…...

本地使用3台centos7虚拟机搭建K8S集群教程

第一步 准备3台centos7虚拟机 3台虚拟机与主机的网络模式都是桥接的模式,也就是他们都是一台独立的“主机” (1)kebe-master的配置 虚拟机配置: 网络配置: (2)kebe-node1的配置 虚拟机配…...

NVIDIA CUDA驱动安装

1 引言 因为笔记本电脑上运行Milvus图像检索代码,需要安装CUDA驱动。电脑显卡型号是NVIDIA GeForce GTX 1050 Ti Mobile, 操作系统是Ubuntu 20.04,内核版本为Linux 5.15.0-72-generic。 2 CUDA驱动测试 参考网上的资料:https://blog.csdn.…...

python 从excel中获取需要执行的用例

classmethod def get_excel_data(cls, excel_name, sheet_name, case_numNone):"""读取excel文件的方法:param excel_name: 文件名称:param sheet_name: sheet页的名称:param case_name: 执行的case名称:return:"""def get_row_data(table, row)…...

Web3中文|乱花渐欲meme人眼,BRC-20总市值逼近10亿美元

现在的Web3加密市场,用“乱花渐欲meme人眼”来形容再合适不过了。 何为meme? “meme”这个词大概很多人都不知道如何正确发音,并且一看到它就会和狗狗币Dogecoin等联系在一起。那它究竟从何而来呢? Meme:[mi:m]&#x…...

盖雅案例入选「首届人力资源服务国际贸易交流合作大会20项创新经验」

近日,首届人力资源服务国际贸易交流合作大会顺利召开。为激励企业在人力资源服务贸易领域不断创新,加快培育对外贸易新业态、新模式,形成人力资源服务领域国际竞争新优势,大会评选出了「首届人力资源服务国际贸易交流合作大会20项…...

[论文笔记]SimMIM:a Simple Framework for Masked Image Modeling

文章地址:https://arxiv.org/abs/2111.09886 代码地址:https://github.com/microsoft/SimMIM 文章目录 摘要文章思路创新点文章框架Masking strategyPrediction headPrediction targetEvaluation protocols 性能实验实验设置Mask 策略预测头目标分辨率预…...

mysql从零开始(4)----索引/视图/范式

接上文 mysql从零开始(3) 索引 索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引,也可以多个字段联合起来添加索引。索引相当于一本书的目录,是为了缩小扫描范围…...

Flutter框架:从入门到实战,构建跨平台移动应用的全流程解析

第一章:Flutter框架介绍 Flutter框架是由Google推出的一款跨平台移动应用开发框架。相比其他跨平台框架,Flutter具有更高的性能和更好的用户体验。本章将介绍Flutter框架的概念、特点以及与其他跨平台框架的比较,以及Flutter开发环境的搭建和…...

Spring AOP+注解方式实现系统日志记录

一、前言 在上篇文章中,我们使用了AOP思想实现日志记录的功能,代码中采用了指定连接点方式(Pointcut(“execution(* com.nowcoder.community.controller..(…))”)),指定后不需要在进行任何操作就可以记录日志了&…...

OpenGL 4.0的Tessellation Shader(细分曲面着色器)

细分曲面着色器(Tessellation Shader)处于顶点着色器阶段的下一个阶段,我们可以看以下链接的OpenGL渲染流水线的图:Rendering Pipeline Overview。它是由ATI在2001年率先设计出来的。 目录 细分曲面着色器细分曲面Patch细分曲面控…...

项目经理如何及时掌控项目进度?

延迟是指超出计划的时间,而无法掌控则意味着管理者对实际情况一无所知。 为了解决这些问题,我们需要建立好的制度和沟通机制。例如使用项目管理软件来跟踪进度、定期开会并避免沟通障碍等。 管理者可以建立相关制度: 1、建立进度记录制度。…...

HTML <applet> 标签

HTML5 中不支持 <applet> 标签在 HTML 4 中用于定义嵌入式小程序(插件)。 实例 一个嵌入的 Java applet: <applet code="Bubbles.class" width="350" height="350"> Java applet that draws animated bubbles. </applet&g…...

加密与解密

加密与解密 加密方式分类 加密方式主要分为两种 一种是对称加密一种是非对称加密 对称加密 对称和非对称两种方式主要说的是加密和解密两个过程。 如果对数据用一个钥匙进行了加密&#xff0c;那么&#xff0c; 你想成功读取到这个加密了的数据的话&#xff0c;就必须对这…...

京东金融Android瘦身探索与实践

作者&#xff1a;京东科技 冯建华 一、背景 随着业务不断迭代更新&#xff0c;App的大小也在快速增加&#xff0c;2019年~2022年期间一度超过了117M&#xff0c;期间我们也做了部分优化如图1红色部分所示&#xff0c;但在做优化的同时面临着新的增量代码&#xff0c;包体积一直…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...