JAVA中的异常

一、简介

1.1 什么是异常

  异常,是对程序在运行过程中遇到的种种不正常的情况的描述。异常在java中用Exception类来描述。如果程序遇到了未经处理的异常,将会导致程序无法编译或者无法继续运行。

1.2 异常的继承体系

 在java中使用类Throwable来描述所有的不正常的情况。

 Throwable有两个子类,Error和Exception。其中Error用于描述发生在JVM级别的错误信息,这些错误无法被处理。Exception用来描述程序在编译或者运行的过程中遇到的异常信息,这些异常一旦处理了,对程序的编译和运行是没有影响的。

1.3 异常的分类

普通的异常发生,将会导致程序无法进行正常的编译。这种异常,称为None-Runtime Exception,非运行时异常,或者称为编译时异常,也有人称之为检查性异常,原因在于该种异常,都是javac编译器能直接检查到的异常。

     -- 编译器javac.exe  在将源文件(*.java)编译成字节码文件(*.class)时,会主动检查代码的语法格式,如果不正确,就不进行编译工作。如果正确了,才会执行编译工作。

而在Exception的子类RuntimeException中,对异常进行了自动的处理,使其可以正常的编译 运行。但是一旦出现未经处理的异常,依然会导致程序无法继续向下执行。这样的异常称为-- Runtime Exception,运行时异常。 这类异常,通常编译器是不做任何检查的,所以也叫非检查性异常。

总之,异常可以分为 运行时异常编译时异常

二、异常的处理

2.1异常处理的语法

try {
   // 将可能会出现异常的代码放到这里执行
   // 一旦try中的代码出现了异常,则从出现异常的位置开始,到try的大括号的扩回,这一段代码就不执行了。
}catch (需要捕获的异常的类型  标识符) {
   // 如果try中的代码出现了异常,并且异常对象的类型和捕获的类型一致 
   // 这里的代码将会执行
   // 一旦一个异常被捕获了,那么这个异常将不再影响程序的编译和执行
}

1. 将可能出异常的代码片段放入try的语句块中, 
2. jvm在运行程序时,如果出现了异常,则从出现异常的位置开始,到try的大括号的扩回,这    一段代码就不执行了。
3. jvm在运行程序时,如果出现了异常,会自动创建一个具体的异常对象
4. catch(需要捕获的异常的类型  标识符){}用于捕获异常操作
5. jvm创建的异常对象如果与catch捕获的异常对象类型匹配(或者向上造型没问题),就会就将地址值赋值给异常类型变量。
6. catch捕获到异常对象后,就会执行对应的{}里的代码。这个异常将不再影响程序的编译和执行
7. catch模块如何处理异常呢? 比如打印异常信息,供程序员查看,然后进行调试,或者继续抛给调用者

public class example1 {public static void main(String[] args) {int[] age = {1, 2, 3, 4, 5};try {System.out.println(age[6]);//打印下标是6的元素} catch (Exception e) {e.printStackTrace();}System.out.println("程序继续执行")}
}

显示数组下标越界异常,并没有影响程序继续向下运行,继续执行打印语句:程序继续执行

2.2 多种异常的处理

 try {
   // 可能出现异常的代码
}catch (异常类型1 标识符) {
   // 针对异常类型1的处理
}catch (异常类型2 标识符) {
   // 针对异常类型2的处理
}catch (异常类型3 标识符) {
   // 针对异常类型3的处理
}
...

需要注意异常的书写顺序。

如果多个catch的异常之间不存在继承关系,也就是同级关系,不需要考虑书写顺序。
如果多个catch的异常之间存在继承关系,则必须子类异常在前,父类异常在后。

如果处理的多种异常没有继承关系,并且处理方式相同,可以简写成如下语法:

try {
   // 可能会出现多种异常的代码
}catch (异常类型1 | 异常类型2 | ... 标识符) {
   // 出现了多种异常之一,都可以被这里捕获
}

public class example1 {public static void main(String[] args) {try{String a=null;System.out.println(a.length());}catch (NullPointerException |ArrayIndexOutOfBoundsException e){e.printStackTrace();}}
}

 或者使用父类异常处理

try {
   // 可能会出现多种异常的代码
}catch (Exception e) {
   // 处理的代码逻辑都一样,就一种。
}

public class example1 {public static void main(String[] args) {try{String a=null;System.out.println(a.length());}catch (Exception e){e.printStackTrace();}}
}

 2.3 finally模块

finally用在try后面,或者catch后面,作为异常捕获的结尾。

特点:finally中的语句始终会执行。(无论try中的代码是否出现了异常,这里的代码都会执行)

使用场景:会在finally中做资源释放、流的关闭等操作。

案例1:

public class example2 {public static int test1(){int i = 1;try {i++;System.out.println("try block, i = "+i);//i为2,逻辑没错误,不执行catch            后代码} catch (Exception e) {i--;System.out.println("catch block i = "+i);} finally {i = 10;System.out.println("finally block i = "+i);//i为10}return i;//i为10}public static void main(String[] args){int result = test1();System.out.println(result);//i为10}
}

案例2: 

public class example2 {public static int test2 () {int i = 1;try {i++;//i为2throw new Exception();//这里抛出了异常,但是没有处理,所以会跳到catch块中} catch (Exception e) {i--;System.out.println("catch block i = " + i);//i为1} finally {i = 10;System.out.println("finally block i = " + i);//i为10}return i;//i为10}public static void main (String[]args){int result = test2();System.out.println(result);//i为10

案例3: 

public class example2 {public static int test3(){//try 语句块中有 return 语句时的整体执行顺序int i = 1;try{i++;System.out.println("try block, i = " + i);//i为2return i;//返回值i为2} catch (Exception e) {i ++;System.out.println("catch block i = " + i);return i;} finally {i = 10;System.out.println("finally block i = " + i);//i为10}}public static void main(String[] args){int result = test3();System.out.println(result);//打印返回值的结果i=2}
}

案例4: 

public class example2 {public static int test4(){//finally 语句块中有 return 语句int i = 1;try {i++;System.out.println("try block, i = " + i);//i为2return i;//返回i的值为2} catch (Exception e) {i++;System.out.println("catch block i = " + i);return i;} finally {i++;System.out.println("finally block i = " + i);//i为3return i;//返回i的值为3,覆盖了前面的返回值2}}public static void main(String[] args){int result = test4();System.out.println(result);//打印结果为3}
}

三、自定义异常

3.1 为什么自定义异常

如果系统给我们提供的异常类型,已经不能满足我们的需求了,或者不知道用哪个了。此时就需要进行异常的自定义。

3.2 如何自定义异常

  • 继承自Exception类或者RuntimeException类或者异常子类。

  • 继承自Exception类的异常是 编译时异常。

  • 继承自RuntimeException类的异常是运行时异常。

格式如下:

Class 异常名 extends Exception{ //或继承RuntimeException
   public 异常名(){
   }
   public 异常名(String s){ 
      super(s); 
   }
}

案例:

public class example3 {public static void main(String[] args) {try {person p = new person(-1);} catch (NoAgeException e) {System.out.println(e.getMessage());//打印异常的信息}}
}
class person{//定义一个person的类private int age;person(int age) throws NoAgeException {//声明异常this.age=age;if(age<0||age>200){throw new NoAgeException("年龄不合法");//实例化异常对象}}
}
class NoAgeException extends Exception{//自定义异常,继承Exception,编译时异常NoAgeException(String message){super(message);}
}

3.3throw和throws关键字

throw:

用在程序方法中,表示抛出异常。一个异常对象实例化完成后,没有任何意义,只有当把这个异常抛出之后,这个异常才会生效,具有阻止程序的编译或者运行的意义。

throws:

1. 书写位置:在方法的定义格式中,也就是形参列表的后面。用于声明异常类型。
     修饰词  返回值类型 方法名(形参列表) throws 异常类型名{
     
     }
2. 当我们throw的是RuntimeException类的异常时,不需要throws来声明异常类型, 声明没有意义,JVM运行程序才能知道。
3. 当我们throw的是Exception异常时,必须使用throws来声明异常类型,用来告知  谁调用这个方法,谁处理异常。

public class example2 {public static void main(String[] args){try {test();//main()方法调用了test()方法,所以要处理异常} catch (Exception e) {System.out.println(e.getMessage());//打印异常对象的信息}}public static String test() throws Exception {//异常声明,谁调用这个方法谁处理异常try {int[] a = {1, 2, 3};a[10] = 10;//给下标为10的元素赋值为10,但是数组下标只到2,出现异常} catch (ArrayIndexOutOfBoundsException e) {throw new Exception("数组越界了");//执行这行代码,实例化了一个异常对象}return "-----";}
}

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

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

相关文章

数字水印嵌入及提取系统——基于小波变换GUI

数字水印嵌入及提取系统——基于小波变换GUI 基于小波变换的数字水印系统&#xff08;Matlab代码GUI操作&#xff09; 【有简洁程序报告】【可作開题完整文档达辩PPT】 本系统主要的内容包括&#xff1a; &#xff08;1&#xff09;使用小波变换技术实现二值水印图像的加密、…

Linux_帮助指令

man 获得帮助信息 基本语法: man [命令或配置文件] 在linux下,隐藏文件是以 .开头, 选项可以组合使用, 比如 ls -al, 不如 ls -al /root help 指令 基本语法: help 命令 (功能描述: 获取shell内置命名的帮助信息) 英语不好建议百度

Day4 25/2/17 MON

【一周刷爆LeetCode&#xff0c;算法大神左神&#xff08;左程云&#xff09;耗时100天打造算法与数据结构基础到高级全家桶教程&#xff0c;直击BTAJ等一线大厂必问算法面试题真题详解&#xff08;马士兵&#xff09;】https://www.bilibili.com/video/BV13g41157hK?p4&v…

redis集群模式

1.集群模式 作用&#xff1a;解决单点故障问题 集群的模式&#xff1a;1.主从模式&#xff0c;2、哨兵模式&#xff0c;3、集群化模式 1.1主从模式 特点&#xff1a;1个主节点多个从节点&#xff0c;主节点负责读写操作&#xff0c;而从节点只能负责读操作&#xff0c;当主…

力扣 乘积最大子数组

动态规划&#xff0c;注意负负得正&#xff0c;dp交换。 题目 注意这里的dp的乘积要求最大&#xff0c;而两个很大的负数相乘也是大的&#xff0c;因此在每遍历到一个数时要存一个最大值的dp与一个最小值的dp&#xff0c;然后遍历完后再去存ans的dp。由于存在负数&#xff0c;…

【Postgresql】Windows 部署 Postgresql 数据库 (图文教程)

文章目录 准备工作Postgresql 下载Postgresql 安装初始化数据库数据库链接设置允许远程连接测试链接 更多相关内容可查看 准备工作 操作系统&#xff1a;Windows 7 或更高版本&#xff08;推荐 Windows 10 或 Windows Server 2016&#xff09;。 硬件要求&#xff1a; 至少 …

【ENSP】链路聚合的两种模式

【ENSP】链路聚合的两种模式 1、背景介绍2、链路聚合的使用场景3、配置过程1、手工模式Eth-Trunk配置2、静态LACP模式Eth-Trunk 4、总结 1、背景介绍 随着网络规模的不断扩大&#xff0c;人们对骨干链路的带宽吞吐量和可靠性提出了越来越高的要求。在传统方案中&#xff0c;为…

《深度学习》——调整学习率和保存使用最优模型

调整学习率 在使用 PyTorch 进行深度学习训练时&#xff0c;调整学习率是一个重要的技巧&#xff0c;合适的学习率调整策略可以帮助模型更好地收敛。 PyTorch 提供了多种调整学习率的方法&#xff0c;下面将详细介绍几种常见的学习率调整策略及实例代码&#xff1a; torch.opt…

SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在经济高速发展、物质生活极大丰富的当下&#xff0c;人们的精神需求愈发凸显&#xff0…

《仙台有树》追剧疑问与DeepSeek解答

本篇形式&#xff1a;直接以两段对话直接呈现&#xff0c;有删减 本篇背景&#xff1a;看过太多逻辑bug&#xff0c;有些bug无药可救直接弃剧&#xff0c;有些bug情有可原包容理解。想到最近大火的DeepSeek&#xff0c;就与时俱进&#xff0c;简单直接点吧&#xff0c;也许自己…

Java版企业电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

txt文件批量转PDF

需要使用acrobat DC软件。 工具 – 创建 PDF – 多个文件&#xff08;可以选择多个TXT文件&#xff0c;过多可能内存溢出&#xff09;。

学习笔记之debian的thonny开发(尚未验证)--从stm32裸机到linux嵌入式系统

这应该算 stm32裸机用户 转 linux嵌入式系统 的入门学习笔记。 【鲁班猫】39-vnc远程桌面连接鲁班猫_哔哩哔哩_bilibili 本集的鲁班猫的视频介绍中&#xff0c;没有清晰明确指出需要linux开发板接入网络&#xff0c;接入网络可以使用有线网口或者wifi路由&#xff0c;有些提示…

PVE使用一个物理网卡采用VLAN为管理IP和VM分配网络的问题

问题描述&#xff1a; 部署PVE后&#xff0c; 想着在上面部署多个不同VLAN的VM &#xff08;类似于VMwarere ESXi&#xff09;&#xff0c;但有人反馈无法使用VLAN&#xff0c;只能配置部署PVE时使用的网段。 问题分析&#xff1a; 在PVE的主机节点网络配置中&#xff0c;默认…

15.3.10 窗体下使用多线程

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 从.Net FrameWork2.0开始&#xff0c;为了加强了程序安全&#xff0c;防止跨线程调用导致不可预知的结果。微软将窗体主线程&#x…

ASP.NET Core SixLabors.ImageSharp v3.x 的图像实用程序类

使用用 C# 编写的 asp.net core web 应用程序示例在 Windows 和 Linux web 服务器上处理图像&#xff0c;包括创建散点图和直方图&#xff0c;以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 3.1.x&#xff09;添…

【leetcode】200.岛屿数量(DFS入门)

实战总结 用char型接收整形int转化为的对应字符要小心 int res; char res 0; 其中 res 的上限是127。 在下面这道题中&#xff0c;笔者一开始想将遍历过的位置更新值为 res ‘0’&#xff0c;但当岛屿数过多的时候就溢出了&#xff0c;所以还是应该将遍历过的位置更新为‘…

CES Asia 2025“科技+文旅”融合计划:开启文旅新篇

CES Asia 2025第七届亚洲消费电子技术贸易展&#xff08;赛逸展&#xff09;将在首都北京盛大举行&#xff0c;其亮点十三“‘科技文旅’融合计划”备受瞩目&#xff0c;为科技与文旅产业的深度融合带来了新的契机与活力。 在“科技文旅”融合计划中&#xff0c;景区智能设备租…

【Git版本控制器】第三弹——版本回退,撤销修改,删除文件

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ 相关笔记&#xff1a; https://blog.csdn.net/djd…

DeepSeek ,银行营销会被 AIGC 颠覆吗?

AI 让银行营销更智能&#xff0c;但更重要的是“懂客户” AI 在银行营销中的应用已经不仅仅局限于文案生成&#xff0c;而是渗透到了整个营销流程。 据悉&#xff0c;中国银行已经开始利用 AI 大模型构建智能营销助手系统&#xff0c;结合知识图谱和 AI 技术&#xff0c;实现…