JAVA那些事(八)异常处理

异常处理机制

Java中的异常处理机制是Java程序设计中非常重要的一个特性,它允许程序在出现错误或意外情况时进行适当的响应,而不是直接导致程序崩溃。异常处理遵循“捕获或者声明”原则,这意味着程序员要么捕获并处理可能发生的异常,要么声明方法可能抛出异常。

java使用异常对程序给出一个统一和相对简单的抛出和处理错误的机制。

如果一个方法本身能抛出异常,调用者可以捕获异常使之得到处理;

也可以回避异常,这时异常将在调用的堆栈中向下传递,直到被处理。

错误分类:

一类是非致命性的,通过某种修正后程序还能继续执行。这类错误称作异常。

另一类是致命性的,即程序遇到了非常严重的不正常状态,不能简单地恢复执行,这就是错误。、

异常分类:

检查型异常(Checked Exception): 这类异常在编译期间就会被检查,如果一个方法可能会抛出检查型异常,那么该方法必须使用 throws 关键字声明它可能抛出的异常类型,或者在方法内部捕获并处理这些异常。例如:IOExceptionSQLException 等。

public void readFile() throws IOException {File file = new File("file.txt");FileReader fr = new FileReader(file);// ...
}

运行时异常(Unchecked Exception): 这类异常不需要在方法签名中声明,通常是因为编程错误或者逻辑错误导致的,如空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)等。虽然编译器不会强制要求处理这类异常,但良好的编程习惯建议在代码中适当处理这类异常。

public void processValue(int[] array, int index) {try {System.out.println(array[index]);} catch (ArrayIndexOutOfBoundsException e) {e.printStackTrace();}
}

 

异常处理方式:

异常处理的方法有两种:

1.使用trycatchfinally结构对异常进行捕获和处理;

2.通过throwsthrow抛出异常

异常处理语句结构:

Java使用 try-catch-finally 结构来处理异常

格式;

try

{

   可能出现异常的程序代码

}

catch (异常类名1   异常对象名1)

异常类名1对应的异常处理代码   }

catch (异常类名2   异常对象名2)

异常类名2对应的异常处理代码  }

[ finally

  {  必须执行的代码     } ]

try 块中放置可能出现异常的代码,当发生异常时,控制流立即跳转到与之匹配的 catch 块。如果异常没有被捕获,程序将终止,并打印堆栈跟踪信息。finally 块总是在 try 或者 catch 后面执行,用于资源清理工作,如关闭文件、数据库连接等。

将可能发生异常的程序代码放置在try程序块中。程序运行过程中,如果该块内的代码没有出现任何异常,后面的各catch块不起任何作用。但如果该块内的代码出现了异常,系统将终止try块代码的执行,自动跳转到所发生的异常类对应的catch块中,执行该块中的代码。

其中的finally块是个可选项,如果含有finally块,无论异常是否发生,finally块的代码必定执行。 一个try块可以对应多个catch块,用于对多个异常类进行捕获。

以下4种特殊情况下,finally块不会被执行:

finally语句块中发生了异常;

在前面的代码中使用了System.exit()退出程序;

程序所在的线程死亡;

关闭CPU

e.g.

public class Exception1
{public static void main(String args[]){try{int a[]={1,2,3,4,5}, sum=0;for (int i=0; i<=5; i++) sum=sum+a[i];System.out.println("sum="+sum);System.out.println("Successfully! ");}catch (ArrayIndexOutOfBoundsException e){System.out.println("ArrayIndexOutOfBoundsExceptiondetected");}finally{System.out.println(" Programm Finished! ");}}  
} 

运行这段代码时,由于循环条件错误,程序会在遍历到第6个元素时抛出异常。此时,控制流会立即跳转到与之匹配的 catch 块,输出 "ArrayIndexOutOfBoundsException detected"。最后,无论是否发生异常,都会执行 finally 块中的代码,输出 "Programm Finished!"。

一个try块可以对应多个catch块,用于对多个异常类进行捕获:

当匹配某一个catch块的时候,就直接进入到这个catch块里面,后面在再有catch块的话,它不做任何处理,全部忽略掉;

所有catch块必须从最具体到最一般的顺序排列,即多个catch块中的异常出现继承关系,父类异常catch块放在最下面;

抛出异常

通常情况下,异常是由系统自动捕获的。但程序员也可以自己通过throw语句抛出异常。

格式如下:

    throw  new 异常类名(信息)

    异常类名  e=new 异常类名(信息);

     throw e;

抛出异常选项

 在有些情况下,一个方法并不需要处理它所生成的异常,而是向上传递,由调用该方法的其他方法来捕获该异常,这时就要用到throws子句。其格式如下:

返回值类型名  方法名([参数表]throws 异常类型名

{ 

声明部分

 语句部分

}

public void readAndProcessFile() throws FileNotFoundException, IOException {// 方法体内的代码
}

e,g,实例

public class Exception4{public static int Sum() throws  NegativeArraySizeException{int s = 0;int x[] = new int[-4];for (int i=0; i<4; i++) {x[i]=i;s = s + x[i];}return s;}public static void main(String args[]){try{System.out.println(Sum());}catch (NegativeArraySizeException e){System.out.println("异常信息:"+e.toString());}}}

 

代码定义了一个名为 Exception4 的类,其中包含两个方法:Sum()main(String args[])。主要目的是演示如何抛出和捕获 NegativeArraySizeException 异常。

  1. 方法 Sum()

    • 定义为静态方法,返回一个整数。
    • 使用 throws NegativeArraySizeException 声明此方法可能会抛出 NegativeArraySizeException 异常。
    • 在该方法内部尝试创建一个大小为 -4 的数组,由于数组长度不能为负数,在创建时会抛出 NegativeArraySizeException 异常。
    • 即使创建数组的语句会导致异常,后续代码仍尝试对这个不存在的数组进行初始化和求和操作,但实际在创建数组时程序就已经抛出了异常,并不会执行到这些语句。
  2. main(String args[]) 方法:

    • 包含一个 try-catch 结构来捕获可能由 Sum() 方法抛出的 NegativeArraySizeException 异常。
    • 在 try 块中调用 Sum() 方法并打印其返回值。
    • 当 Sum() 方法抛出异常时,控制流会立即跳转到相应的 catch 块,这里输出了捕获到的异常信息。

 自定义异常类

自定义异常类可以通过继承Exception类来实现。其一般形式为:

class   自定义异常类名   extends Exception

{

        异常类体;

}

class MyCustomException extends Exception {public MyCustomException(String message) {super(message);}
}

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

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

相关文章

ReactNative 常见问题及处理办法(加固混淆)

文章目录 摘要 引言 正文ScrollView内无法滑动RN热更新中的文件引用问题RN中获取高度的技巧RN强制横屏UI适配问题低版本RN&#xff08;0.63以下&#xff09;适配iOS14图片无法显示问题RN清理缓存RN navigation参数取值pod install 或者npm install 443问题处理 打开要处理的…

2023中国PostgreSQL数据库生态大会-核心PPT资料下载

一、峰会简介 大会以“极速进化融合新生”为主题&#xff0c;探讨了PostgreSQL数据库生态的发展趋势和未来方向。 在大会主论坛上&#xff0c;专家们就PostgreSQL数据库的技术创新、应用实践和生态发展进行了深入交流。同时&#xff0c;大会还设置了技术创新&云原生论坛、…

2023年后,AI 还有什么研究方向有前景?

什么是AI ​ AI代表人工智能&#xff0c;它是指通过计算机科学技术使机器能够执行需要智力的任务的一种技术。这些任务包括学习、推理、问题解决和感知等&#xff0c;通常是人类智能的表现。人工智能的目标是使计算机系统能够执行需要人类智力的任务&#xff0c;而不需要人类的…

国产高分七号光学影像产品预处理步骤

1.引言 高分七号卫星采用主被动光学复合测绘新体制&#xff0c;星上搭载了双线阵相机、激光测高仪等有效载荷&#xff0c;其中双线阵相机可有效获取20公里幅宽、优于0.8m&#xff08;后视&#xff1a;0.65m;前视&#xff1a;0.8m&#xff09;分辨率的全色立体影像和2.6m分辨率的…

Java中的Queue

Java中的Queue 在Java中&#xff0c;Queue 接口代表了一个队列数据结构&#xff0c;它按照先进先出&#xff08;First In, First Out&#xff0c;FIFO&#xff09;的原则进行元素的操作。Queue 接口扩展自 Collection 接口&#xff0c;定义了一系列方法&#xff0c;包括添加、删…

JavaWeb——后端之Mybatis

四、Mybatis 概念&#xff1a; Mybatis是一款持久层&#xff08;Dao层&#xff09;框架&#xff0c;用于简化JDBC&#xff08;Sun操作数据库的规范&#xff0c;较繁琐&#xff09;的开发 历史&#xff1a; Apache的一个开源项目iBatis&#xff0c;2010年由apache迁移到了goog…

Zookeeper(持续更新)

VIP-01 Zookeeper特性与节点数据类型详解 文章目录 VIP-01 Zookeeper特性与节点数据类型详解正文1. 什么是Zookeeper&#xff1f;2. Zookeeper 核心概念2.1、 文件系统数据结构2.2、监听通知机制2.3、Zookeeper 经典的应用场景3.2. 使用命令行操作zookeeper 正文 什么是Zookee…

初学编程,到底选Java还是C++?

初学编程&#xff0c;到底选Java还是C? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#x…

LeGO-LOAM 安装以及运行

一、源码地址&#xff1a; GitHub - RobustFieldAutonomyLab/LeGO-LOAM: LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable TerrainLeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain - GitH…

计算机网络问题

计算机网络问题 1、路由表中有环怎么办&#xff1f;&#xff08;字节&#xff09; 路由是网络层组件 什么是路由表&#xff1f; 什么是路由回路&#xff1f; 在维护路由表信息的时候&#xff0c;如果在拓扑发生改变后&#xff0c;网络收敛缓慢产生了不协调或者矛盾的路由选…

【MySQL】如何选择字符集与排序规则(字符集校验规则)

思考 就中文而言&#xff0c;MySQL 中可以选择 gb2312 、utf8 及 utf8mb4 。这三种字符集有什么差异 &#xff1f;应该如何选择&#xff1f; 比较项gb2312utf8utf8mb4字符集范围简体中文字符集大部分 Unicode 字符更广泛的 Unicode 字符&#xff0c;包括罕见字符和 Emoji 表情…

1688商品详情API:实现商品详情自动化的关键步骤

要实现商品详情的自动化&#xff0c;你可以遵循以下关键步骤&#xff1a; 明确需求和目标&#xff1a;首先&#xff0c;明确你想要通过自动化实现什么。是想要定期获取商品数据&#xff0c;进行数据分析&#xff0c;还是其他目的&#xff1f;确定目标有助于制定计划和步骤。集…

异步任务判断执行和重复使用实现类

主要是展示一下如何在书写异步任务判断的时候&#xff0c;如何根据返回值类型进行重复使用相同接口里面的不同实现类的方法 /*** 父类接口* **/ public interface Exceutor {String getTaskType();void excetuor(String s); }/*** 异步处理任务的任务类型** author yangziqian…

arcpy点要素生成经纬度字段脚本

说明 本脚本是用来简化操作的&#xff0c;正常情况下要生成经纬度字段&#xff0c;需要添加字段→填写字段名→写字段类型→字段计算器→计算几何。。。 而且经纬度都需要&#xff0c;要循环两遍。 本脚本就是为了简化以上操作的&#xff0c;安装后&#xff0c;打开脚本直接输…

从《数据库索引设计与优化》看mysql索引设计

很久之前写的一篇文章&#xff0c;主要是结合mysql45讲和《数据库索引设计与优化》讨论索引设计的&#xff0c;拿出来分享下。 选用什么引擎 对于INSERT_SELECT型数据库&#xff0c;如果没有事务的要求&#xff0c;更倾向于选择MyISAM。 因为InnoDB会维护更多的数据&#xff…

一个古老的终端显示控制命令-tput命令|帮你解决中英文混合时终端列对齐输出问题

终端显示控制对于写一个 终端脚本 是非常有用的&#xff0c;在没有图形界面时Unix和类Unix系统用户都是在Terminal控制终端下工作的。虽然Linux操作系统的图形界面出现淡化了终端显示控制&#xff0c;但终端控制功能依旧是每个命令行用户不可或缺的一部分。只是我们不知道在使用…

【LeetCode:129. 求根节点到叶节点数字之和 | 二叉树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

MySQL 8.0 ReplicaSet备库切换为可读写单库

MySQL 8.0 ReplicaSet备库切换为可读写单库 方法一方法二 方法一 从集群中删除备库&#xff08;不会改变备库只读状态&#xff09; # 检查备库标识 var rs dba.getReplicaSet() rs.status()# 移除备库同步 rs.removeInstance("MYSQL_REPLICA_IDENTIFIER:3306") #或…

记录汇川:水塔指令解释-ST

可以通过帮助查看指令手册 PLC的IO地址映射-两种方法 第一种&#xff1a; 新建一个全局变量表&#xff0c;按照如图所示建立IO地址 第二种&#xff1a; 直接如图所示位置定义名字 注意&#xff1a;IW和QB这两个前面一个有蓝色M一个没有。 蓝色的M表示模块发生变化的时候地址不会…

【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(1)

前言 大联大世平集团推出了一款基于 NXP 车规级 MCU S32K344 的开发板——花名“Cavalry”&#xff0c;它使用 BGA257 封装的 32 位 ArmCortex-M7 S32K344 作为主控芯片&#xff0c;在69.6*130mm 的小体积开发板上搭载了 SBC 电源管理芯片、CAN 收发器、LIN 收发器、FLASH 存储…