五分钟”手撕“异常

目录

一、什么是异常

二、异常的体系和分类

三、异常的处理

1.抛出异常

2.异常的捕获

 异常声明throws:

try-catch处理

四、finally 

finally一定会被执行吗? 

五、throw和throws区别

六、异常处理的流程

七、自定义异常


一、什么是异常

顾名思义:就是不正常。比如:

当一个正在运作的机器突然卡了,或者不动了,我们称为异常;

当一个健康的人突然生病了,身体开始不舒服,我们称为异常。

所以:在Java中,将程序执行过程中发生的不正常行为称为异常

二、异常的体系和分类

异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构,Java中的异常是用类来描述的,有各种各样的异常类: 、

 从上图可以看到的体系

1. Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception

2. Error指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表: StackOverflowError和OutOfMemoryError,一旦发生回力乏术

3. Exception异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说 的异常就是Exception。

 

 从上图可以看到的分类

但我们平常说的异常是Exception,它可以分为编译时异常 or 受查异常(check Excepton)和运行时异常 or 非受查异常(uncheck Exception) 。

1.运行时异常,也叫非受查异常,它是用RuntimeException这个类继承的,就是在我点击run运行的时候,它才会报错 

public static void main(String[] args) {//算术异常System.out.println(10/0);//数组越界异常int[] array = new int[10];System.out.println(array[10]);//空指针异常int[] array1 = null;System.out.println(array1.length);}

2.编译时异常,也叫受查时异常,我之前博客也有写过克隆接口,就是在写代码的时候直接报红线,你都编译都不通过: 

class Person implements Cloneable {@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Test {public static void main(String[] args) {//编译时异常 也叫 受查异常Person person = new Person();Person person1 = (Person) person.clone();}
}

当然,大家要注意:语法错误不算异常!!!! 比如:下图,少了个分号(中文分号,变量名重复,关键字拼写错误....等等都只算语法错误,并不是异常)

  

三、异常的处理

既然我们知道异常影响代码的工作,那我们怎么处理呢?

在Java中,异常处理主要的5个关键字:throw、try、catch、final、throws。

1.抛出异常

 在Java中,可以借助throw关键字抛出一个指定的异常对象,将错误信息告知给调用者

public static void getElement(int[] arr, int index)  {if (arr == null) {throw new NullPointerException("数组为空");}if(index<0||index>=arr.length){throw new ArrayIndexOutOfBoundsException("数组越界");}
}
public class Test{public static void main(String[] args) {int[] array = {1,2,3};getElement(array, 3);System.out.println("你好");}
}

【注意事项】:

1. throw必须写在方法体内部。

2. 抛出的对象必须是Exception 或者 Exception 的子类对象。

3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,代码不报错不划红线,则可以不用处理,直接交给JVM来处理

4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译。

5. 异常一旦抛出,其后的代码就不会执行 。

2.异常的捕获

 异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws 以及 try-catch捕获处理。

 异常声明throws:

public class Config {File file;public void OpenFile(String name)throws FileNotFoundException{if(name.equals("abc")){throw new FileNotFoundException("文件名出错");}}
}

也就是在方法的后面写上:throws+xxxException 。

FileNotFoundException : 编译时异常,

表明文件不存在 此处不处理,也没有能力处理,应该将错误信息报告给调用者,让调用者检查文件名字是否给错误了。

(如果在main方法也不想画红线,在main方法后面也throws就好了,但是都没有处理这个异常,这时候就会交给JVM处理,JVM的处理方法就是直接崩溃!!!)

方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。

try-catch处理

我们可以发现throws根本没有实际上解决异常,它只是让程序不报错,或者交给别人或者JVM处理,那我们怎么才能真正的处理这个异常呢?这时候就用到我们的try-catch了 。

public static void main(String[] args) {try {int[] arr = null;getElement(arr, 3);System.out.println("哈哈");} catch (NullPointerException e){System.out.println("处理这个异常");//打印一下在哪里出错了e.printStackTrace();System.out.println("处理完成");}catch (ArrayIndexOutOfBoundsException e){System.out.println("发现异常");e.printStackTrace();}System.out.println("你好");}

1.try捕捉到异常后,不执行在try中这个异常后面的程序,所以不打印”哈哈“。

2.明明我的e.printStackTrace()在sout("处理完成")的后面,为什么顺序却反了呢?

答:为什么会出现程序输出偏差呢,先打印sout再打印异常,sout和异常打印不是同个打印,他们存在打印的偏差 不用理会,打印得出来就好了

3.main方法后面的程序继续执行,所以会打印”你好“。(什么时候不会打印呢?交给JVM的时候)如下:

四、finally 

所以引出我们的finaly:不管捕没捕到,都要执行 

    public static void main6(String[] args) {//若无法匹配到异常,就交给JVM,让JVM来判断try {int[] array = {1,2,3};System.out.println(array[3]); // 此处会抛出数组越界异常}catch (NullPointerException e){ // 捕获时候捕获的是空指针异常--真正的异常无法被捕获到e.printStackTrace();}finally{System.out.println("哈哈");}//若交给JVM判断的话,JVM收到后中断程序,接下来的代码也不会执行(除了finally)System.out.println("后序代码");}

在写程序时,有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源:网络连接、数据库 连接、IO流等,在程序正常或者异常退出时,必须要对资源进进行回收。另外,因为异常会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的。

finally一定会被执行吗? 

  1. 当在try块中遇到System.exit()方法时,程序会立即退出,finally块中的代码不会被执行。

  2. 当在try块中遇到无限循环或者死循环时,finally块中的代码不会被执行。

  3. 当在try块中遇到未捕获的异常或Error时,程序会直接跳转到异常处理代码,finally块中的代码不会被执行。

五、throw和throws区别

throw用于主动抛出异常,throws用于声明方法可能抛出的异常类型。

throw是在方法体内部使用的,而throws是在方法的声明处使用的。 

六、异常处理的流程

 【异常处理流程总结】

1.程序先执行 try 中的代码

2.如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.

3.如果找到匹配的异常类型, 就会执行 catch 中的代码

4.如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.

5.无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).

6.如果上层调用者也没有处理的了异常, 就继续向上传递.

7.一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止.

七、自定义异常

Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我 们实际情况的异常结构 。

具体方法如下:

1. 自定义异常类,然后继承自Exception 或者 RunTimeException

2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因

package demo2;
//Login.java
//自定义
public class Login {public String username="admin";public String password="123456";public void loginInfo(String username, String password) {if (!this.username.equals(username)) {throw new UserNameException("用户名不匹配");}if (!this.password.equals(password)) {throw new PassWordException("密码不匹配");}System.out.println("登录成功");}public static void main(String[] args) {try {Login login=new Login();login.loginInfo("admin","12456");}catch (UserNameException e){e.printStackTrace();}catch (PassWordException e){e.printStackTrace();}}
}package demo2;
public class PassWordException extends RuntimeException{public PassWordException(){}public PassWordException(String s){super(s);}
}package demo2;
public class UserNameException extends RuntimeException{public UserNameException(){}public UserNameException(String s){super(s);}
}

注意事项:

自定义异常通常会继承自 Exception 或者 RuntimeException

继承自 Exception 的异常默认是受查异常

继承自 RuntimeException 的异常默认是非受查异常 

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

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

相关文章

大模型额外篇章二:基于chalm3或Llama2-7b训练酒店助手模型

文章目录 一、代码部分讲解二、实际部署步骤(CHALM3训练步骤)1)注册AutoDL官网实名认证2)花费额度挑选GPU3)准备实验环境4)开始执行脚本5)从浏览器访问6)可以开始提问7)开始微调模型8)测试训练后的模型三、基于Llama2-7b的训练四、额外补充1)修改参数后2)如果需要访问…

PHP:open_basedir restriction in effect.

当我们下载了组件&#xff0c;引入的时候出现 open_basedir restriction in effect&#xff0c;那这个时候我们该怎么弄呢&#xff1f; 首先我们进入宝塔管理页面&#xff1a;【软件商店】-【运行环境】-【安装PHP】-【设置】 其中后面的路径是用 : 来分隔表示多少个&#xff…

指纹识别系统架构

目录 1. 系统架构 1.1 指纹采集模块 1.2 指纹处理模块 1.3 指纹登记模块 1.4 指纹识别模块 1.5 指纹识别决策模块 1.6 管理模块 1.6.1 存储管理 1.6.2 传输管理 1.6.3 安全管理 1.7 应用开放功能 1.7.1 指纹登记功能 1.7.2 指纹验证功能 1.7.3 指纹辨识功能 2. …

Android Studio制作简单登录界面

Android Studio制作简单登录界面 实现目标 应用线性布局设计登录界面&#xff0c;要求点击输入学号时弹出数字键盘界面&#xff0c;点击输入密码时弹出字母键盘&#xff0c;出现的文字、数字、尺寸等全部在values文件夹下相应.xml文件中设置好&#xff0c;使用时直接引用。当…

蓝桥杯物联网竞赛_STM32L071KBU6_关于size of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…

【云原生】Kubernetes基础命令合集

目录 引言 一、命令概述 &#xff08;一&#xff09;命令分类 &#xff08;二&#xff09;基本语法 二、查看基本信息 &#xff08;一&#xff09;环境指令 1.查看版本信息 2.查看资源对象简写 3.添加补全信息 4.查看日志 5.查看集群信息 &#xff08;二&#xff0…

数据结构(三)

数据结构&#xff08;三&#xff09; 图状关系顺序存储链式存储十字链表法多重链表法 图的遍历佛洛依德算法迪杰斯特拉算法洪水算法 图状关系 按有无方向分&#xff1a;有向图、无向图 按是否有权值&#xff1a;带权图、不带权图 顺序存储 链式存储 十字链表法 多重链表法 图…

【笔记】软件架构师要点记录(2)

【笔记】软件架构师要点记录 20240523案例一案例二案例三案例四案例五案例六案例七案例十 20240523 基于前10个架构案例场景&#xff0c;对用到的专业术语进行整理&#xff0c;方便后续查看。 案例一 MVC架构风格组件交互方式 MVC是一种用来构建用户界面时采用的架构设计风格…

攻防世界[GoodRe]

攻防世界[GoodRe] 学到知识&#xff1a; 逆向的精髓&#xff1a;三分懂&#xff0c;七分蒙。TEA 算法快速识别&#xff08;蒙&#xff09;&#xff1a; 数据处理的形式&#xff1a;进入加密时的数据和加密结束后的数据&#xff0c;处理时数据的分组等等&#xff0c;都能用来…

使用libtorch加载YOLOv8生成的torchscript文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 LabelMe 工具进行标注&#xff0c;然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容…

VMware虚拟机如何与主机共享文件夹

本机:WIN10 VMware虚拟机:WIN7 因为每次配置都爱忘记操作,目标是为了在WIN7虚拟机中可以访问本机文件 首先本机操作 新建一个共享文件夹,不带中文目录(最好不要) 点击共享 选择everyone,记得权限"读取和写入" 然后到虚拟机里面 添加一个网络位置 点击浏览,选择网…

第一节:Redis的数据类型和基本操作

最近整理了关于Redis的一些文档&#xff0c;分享给大家&#xff0c;后续会持续更新...... Redis的数据类型 字符串String String&#xff1a;字符串&#xff0c;可以存储String、Integer、Float型的数据&#xff0c;甚至是二进制数据&#xff0c;一个字符串最大容量是512M 列表…

IS-IS DIS

原理概述 OSPF 协议支持4种网络类型&#xff0c; IS-IS 协议只支持两种网络类型&#xff0c;即广播网络和点到点网络。与 OSPF 协议相同&#xff0c; IS-IS 协议在广播网络中会将网络视为一个伪节点( Pseudonode &#xff0c;简称 PSN )&#xff0c;并选举出一台 DIS ( Designa…

ISCC2024个人挑战赛WP-WEB

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…

springcloud多个服务共用同一个nacos配置

spring:profiles:active: devcloud:nacos:config:server-addr: 172.168.1.xx:8848enabled: truefile-extension: yamlnamespace: public#按需引入nacos中的配置#shared-configs: database.yamlextension-configs:# 数据源配置- data-id: database.yamlgroup: DEFAULT_GROUP# re…

系统思考—问题分析与持续改进

刚刚为一家500强企业完成了《系统思考—问题分析与持续改进》的课程。学员们开始意识到&#xff0c;不能仅仅停留在冰山上层事件去解决问题&#xff0c;而是要深入观察隐藏在背后的趋势变化。学会如何识别系统中的深层次原因&#xff0c;并从全局视角来制定更加有效的改进策略。…

电子电器架构 - 车载网管功能简介

电子电器架构 - 车载网管功能简介 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,…

Windows下安装配置深度学习环境

Windows下安装配置深度学习环境 1. 准备工作 1.1 环境准备 操作系统&#xff1a;win10 22H2 GPU&#xff1a;Nvidia GeForce RTX 3060 12G 1.2 安装Nvidia驱动、cuda、cuDNN 下载驱动需要注册并登录英伟达账号。我这里将下面用到的安装包放到了百度网盘&#xff0c;可以关注微信…

DFA 算法

为什么要学习这个算法 前一段时间遇到了瓶颈&#xff0c;因为词库太多了导致会有一些速度过慢&#xff0c;而且一个正则表达式已经放不下了&#xff0c;需要进行拆分正则才可以。 正好我以前看过有关 dfa 的介绍&#xff0c;但是并没有深入的进行研究&#xff0c;所以就趁着周…

词条唤夜兽唤夜兽的养殖与护理 幻兽帕鲁 唤夜兽怎么获取 唤夜兽去哪里抓 crossover玩Steam游戏

唤夜兽在地图上没有出现&#xff0c;是唤冬兽和雷冥鸟共同培育出来的帕鲁。 ------------------------- 介绍&#xff1a; 帕洛斯群岛之守护神&#xff0c;拥呼唤黑夜之力。 其会于灾厄席捲大地之际腾空而起&#xff0c;唤来无尽暗夜&#xff0c;试图封印灾厄。 ---------…