11-异常-Exception

1. 异常示例

public static void main(String[] args) {int num1 = 10;int num2 = 0;int res = num1 / num2;System.out.println("程序继续运行....");
}

数学上,做除法时,分母不能为0,运行到第三行就会出现错误,程序运行异常,中止运行。

使用 try-catch 对异常进行捕获,保证程序可以继续运行

public static void main(String[] args) {int num1 = 10;int num2 = 0;// 如果进行异常处理,那么即使出现了异常,程序可以继续执行try {int res = num1 / num2;} catch (Exception e) {//e.printStackTrace();System.out.println("出现异常的原因=" + e.getMessage());//输出异常信息}System.out.println("程序继续运行....");
}

2. 异常介绍

将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)

执行过程中所发生的异常事件可分为两大类:

  1. Error(错误):Java虚拟机无法解决的严重问题。如:jvm系统内部错误、资源耗尽等情况,StackOverflowError【栈溢出】、OOM【out of memory】。
  2. Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。

3. 异常分类

异常分为两大类,运行时异常和编译时异常。

3.1 运行时异常示例

  1. NullPointerException 空指针异常
  2. ArithmeticException 数学运算异常
  3. ArrayIndexOutOfBoundsException 数组下标越界异常
  4. ClassCastException 类型转换异常
  5. NumberFormatException 数字格式不正确异常[]

代码示例

// 空指针异常
public class NullPointerException {public static void main(String[] args) {String name = null;System.out.println(name.length());}
}// 数字格式不正确异常
public class NumberFormatException {public static void main(String[] args) {String name = "路明非";// 将 String 转成 intint num = Integer.parseInt(name);//抛出 NumberFormatExceptionSystem.out.println(num);//1234}
}// 数组下标越界异常
public class ArrayIndexOutOfBoundsException {public static void main(String[] args) {int[] arr = {1,2,4};for (int i = 0; i <= arr.length; i++) {System.out.println(arr[i]);}}
}// 类型转换异常
public class ClassCastException {public static void main(String[] args) {A b = new B(); //向上转型B b2 = (B)b;//向下转型,这里是 OKC c2 = (C)b;//这里抛出 ClassCastException}
}
class A {}
class B extends A {}
class C extends A {}

3.2 编译异常示例

编译异常是指在代码编译期间,就必须处理的异常,否则代码不能通过编译。

常见的编译异常

  • SQLException // 操作数据库时,查询表可能发生的异常
  • IOException // 操作文件时,发生的异常
  • FileNotFoundException // 当操作一个不存在的文件时,发生的异常
  • ClassNotFoundException // 加载类,而该类不存时,发生的异常
  • EOFException // 操作文件,到文件末尾,发生的异常
  • IllegalArguementException // 参数异常

代码示例

public static void main(String[] args) {try {FileInputStream fis;fis = new FileInputStream("d:\\aa.jpg");int len;while ((len = fis.read()) != -1) {System.out.println(len);}fis.close();} catch (IOException e) {e.printStackTrace();}
}

当在指定位置找不到要读取的文件时,就会报读取文件异常。

4. 异常处理

异常处理就是当异常发生时,对异常处理的方式。

异常处理的方式

  • try-catch-finally

在代码中捕获发生的异常,自行处理。

  • throws

将发生的异常抛出,交给调用者来处理,最顶级的处理者是JVM。

4.1 try-catch 异常处理

语法

try {可能出现异常的代码快} catch(Exception e) {当发生异常时,系统将异常封装成Exception对象e,传递给catch
得到异常以后,自行处理
如果没有发生异常,catch代码块里的代码不执行}finally {不管try代码块是否有异常发生,始终要执行
所以,一般将要释放资源的代码,放在finally里面}

注意

可以有多个 catch 语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,如果发生异常,一会匹配一个catch。

代码示例

public static void main(String[] args) {try {Person person = new Person();//person = null;System.out.println(person.getName());//NullPointerExceptionint n1 = 10;int n2 = 0;int res = n1 / n2;//ArithmeticException} catch (NullPointerException e) {System.out.println("空指针异常=" + e.getMessage());} catch (ArithmeticException e) {System.out.println("算术异常=" + e.getMessage());} catch (Exception e) {System.out.println(e.getMessage());} finally {}
}

执行顺序

  • 如果没有出现异常,则执行 try 块中所有的语句,不执行 catch 块中的语句,如果有 finally ,最后还要执行 finally 里面的语句。
  • 如果出现异常,则 try 块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还要执行finally里面的语句。

4.2 throws 异常处理

  1. 如果一个方法可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
  2. 在方法声明中用 throws 语句可以声明抛出异常的列表, throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
  3. 对于运行时异常,程序中如果没有做处理,默认就是throws对的方式处理。

代码示例

public static void f() throws ArithmeticException {
}

5. 自定义异常

自己设计异常类,用于描述该错误信息。

自定义异常的步骤

  1. 定义类:自定义异常类名,继承Exception或RuntimeException
  2. 如果继承Exception,属于编译异常
  3. 如果继承RuntimeException,属于运行时异常(一般来说,继承RuntimeException)

代码示例

public class CustomException {public static void main(String[] args) {int age = 180;// 要求范围在 18 – 120 之间,否则抛出一个自定义异常if(!(age >= 18 && age <= 120)) {// 通过构造器,设置信息throw new AgeException("年龄需要在 18~120 之间");}System.out.println("你的年龄范围正确.");}
}// 自定义一个异常
class AgeException extends RuntimeException {public AgeException(String message) {//构造器super(message);}
}

6. throw 和 throws 的区别

throw 手动生成异常对象

意义方法声明处后面跟的东西
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何利用Ubuntu服务器运行深度学习项目?

一、整体思路 先配置好服务器端的软件环境&#xff08;工程源码&#xff0c;miniconda&#xff0c;cuda&#xff0c;显卡驱动等&#xff09;&#xff0c;然后用自己电脑的pycharm远程连接服务器运行代码。一句话总结&#xff1a;借用服务器资源运行代码&#xff0c;本地pycharm…

【推荐系统-特征工程】按每个日期生产特征的大忌

对于每个date&#xff0c;生产这个date前7天的某特征&#xff0c; inputDate 20240501 beginDate 20240501 - 7day SQL要用between这种逻辑 比如where dateColumn > beginDate and dateColumn < inputDate 而不是仅where dateColumn > beginDate。。。

ubuntu安装Stable Video Diffusion(SVD)让图片动起来

目录 写在前面 一、克隆或下载项目 二、下载预训练模型 三、创建环境 四、安装依赖 五、启动项目 六、解决报错 1.预训练模型下不来 2.TiffWriter.write() got an unexpected keyword argument fps 3.安装ffmpeg 4.No module named scripts 七、测试 写在前面 Stab…

深入解析内置模块OS:让你的Python代码更懂操作系统

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、OS模块简介与基础应用 二、文件与目录操作详解 三、OS模块的高级应用&#xff1a;双色…

第5章:软件工程基础知识

软件工程 软件工程过程是指为获得软件产品&#xff0c;在软件工具的支持下由软件工程师完成的一系列软件工程活动&#xff0c;包括以下4个方面。 (1)P(Plan)—软件规格说明。规定软件的功能及其运行时的限制。(2)**D(Do)**一软件开发。开发出满足规格说明的软件。(3)**C(Check…

力扣 90. 子集 II python AC

递归 class Solution:def __init__(self):self.nums Noneself.size Noneself.res []def dfs(self, ans, x0):if ans.copy() not in self.res:self.res.append(ans.copy())for i in range(x, self.size):ans.append(self.nums[i])self.dfs(ans, i 1)ans.pop()def subsetsWi…

web学习笔记(五十八)

目录 1. v-model 双向数据绑定 2. 事件修饰符 3. 路径别名 4. setup语法糖 4.1 语法糖的概念 4.2 setup语法糖 5. 配置代理服务器 1. v-model 双向数据绑定 v-model 双向数据绑定只能使用在表单标签&#xff1b; v-model双向数据绑定原理&#xff1a;采用 Object.de…

Go语言快速上手Zap日志库

1. Zap日志库简介 Zap是由Uber开源的Go语言日志库&#xff0c;以其高性能和易用性在Go社区中广受欢迎。它提供了丰富的日志记录功能&#xff0c;包括不同级别的日志记录、结构化日志输出、日志轮转等。对于Go语言开发者来说&#xff0c;Zap是一个非常好的选择&#xff0c;特别…

解决updateByExample时属性值异常的问题(部分属性值没有使用占位符?进行占位,而是变成了属性的名称)

目录 场景简介代码片断实体类 报错信息排查原因解决测试过程解决方案 场景简介 1、程序将mybatis框架升级为3.5.9版本后执行updateByExample方法时报错 代码片断 Condition condition new Condition(MbCcsSessionConfig.class); condition.createCriteria().andEqualTo(&quo…

【openlayers系统学习】4.3VectorTile 功能交互(指针悬停在要素上时,绘制矩形框)

三、 VectorTile 功能交互&#xff08;指针悬停在要素上时&#xff0c;绘制矩形框&#xff09; 矢量切片的好处是我们可以与要素交互&#xff0c;因为我们在客户端上有数据。但需要注意的一件事是矢量切片针对渲染进行了优化。这意味着要素仅包含过滤和渲染所需的属性&#xf…

panic: concurrent write to websocket connection【golang、websocket】

文章目录 异常信息原由代码错误点 解决办法 异常信息 panic: concurrent write to websocket connection原由 golang 编写 websocket go版本&#xff1a;1.19 使用了第三方框架&#xff1a; https://github.com/gorilla/websocket/tree/main 代码 server.go // Copyright …

【版本标记 | Github】Github 中常见的版本标记(Tags)有哪一些?分别在什么情况下使用?

背景 无论是自己自由开发项目还是公司协同合作&#xff0c;随着软件的迭代升级&#xff0c;都需要一个比较规范&#xff08;好区分&#xff09;的标记来区分不同的软件版本。通常&#xff0c;我们使用不同的数字来表示不同的版本&#xff0c;例如大版本号加上小版本号等&#…

Java核心:注解处理器

Java提供了一个javac -processor命令支持处理标注有特定注解的类&#xff0c;来生成新的源文件&#xff0c;并对新生成的源文件重复执行。执行的命令大概是这样的: javac -XprintRounds -processor com.keyniu.anno.processor.ToStringProcessor com.keyniu.anno.processor.Po…

基于微信小程序的在电影线订票小程序+web管理 uniapp,vue,ssm

基于微信小程序的在电影线订票小程序web管理 uniapp&#xff0c;vue&#xff0c;ssm 相关技术 javassmuniapp微信开发者工具hbuildervueelementui前后端分离 -mysql

PointCloudLib 点云半径滤波实现 C++版本

0.展示效果 滤波之前 1.算法原理 半径滤波原理非常直观,主要用于平滑三维点云数据并去除离群点。 设定搜索半径:首先,为每个点设定一个搜索半径r。这个半径定义了该点周围的一个球形区域。计算邻域点数:接着,计算每个点在其搜索半径r内的邻近点的数量。判断与过滤:根据…

集合框架有哪些

ava集合框架是一个架构&#xff0c;提供了一组接口和类&#xff0c;用于存储和操作一组数据。集合框架主要包含以下几种类型的集合&#xff1a; 1. 集合接口 集合框架中的主要接口包括&#xff1a; Collection&#xff1a;所有集合接口的根接口。List&#xff1a;有序集合&a…

xcode按下delete键不能删除不能使用,解决办法

有可能是按键冲突导致的问题&#xff0c;就是你不小心把delete键绑定了不同的快捷键&#xff0c;所以需要恢复所有的偏好设置和快捷键才可以&#xff0c;我这里就是这样的提示内容&#xff0c;在xcode中按delete键完全无效&#xff1a; 而且还会报红色提示&#xff1a;意思是不…

521源码-免费教程-经常用到的Vue.js的Vue@Cli入门指导

更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源&#xff1a;521源码-网站源码-资源素材-免费下载 Vue.js是一款流行的JavaScript框架&#xff0c;它使得构建交互式的Web界面变得简单和快捷。VueCli是Vue.js官方提供的脚手架工具&…

系统架构师必考题:Redis知识点

系统架构师必考题&#xff1a;Redis知识点 系统架构师案例分析题必考的缓存题目&#xff1a;Redis相关知识点。 1.安装与介绍 安装教程&#xff1a;https://blog.csdn.net/WeiHao0240/article/details/100030637 特点&#xff1a; 性能极高、丰富的数据类型、原子性操作、持…

【安卓12源码】Input子系统(1) - input启动流程

Android Input 体系中&#xff0c;大致有两种类型的事件&#xff1a;实体按键 key 事件&#xff0c;屏幕点击触摸事件。 如果根据事件类型的不同我们还能细分为基础实体按键的 key(power&#xff0c;volume up/down&#xff0c;recents&#xff0c;back&#xff0c;home)&#…