异常-Exception
异常介绍
- 基本概念
Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常) - 执行过程中所发生的异常事件可分为两大类
1,Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。Error是严重错误,程序会崩溃
2,Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码处理。例如 空指针访问,试图读取不存在的文件,网络连接中断等等。
Exception分为两大类:运行时异常(程序运行时,发生的异常)
编译时异常(编程时,编译器检查出的异常) - 异常体系图
- 异常体系图小结
1,异常分为两大类:运行时异常;编译时异常
2,运行时异常:编译器检查不出来,一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常
3,对于运行时异常,可以不作处理,因为这类异常很普通,若全处理可能会对程序的可持续性和运行效率产生影响
4,编译时异常,是编译器要求必须处置的异常
运行时异常
- 常见的运行时
1,NullPointerException 空指针异常
2,ArithmeticException 数学运算异常
3,ArrayIndexOutOfBoundsException 数组下标越界异常
4,ClassCastException 类型转换异常
5,NumberFormatException 数字格式不正确异常[]
编译异常
- 介绍:编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译
- 常见的编译异常
1,SQLException//操作数据库时,查询表可能发生异常
2,IOException//操作文件时,发生的异常
3,FileNotFoundException//当操作一个不存在的文件时,发生异常
4,ClassNotFoundException//加载类,而该类不存在时,发生异常
5,EOFException//操作文件,到文件末,发生异常
6,IIIegalArguementException//参数异常
异常处理
基本介绍
异常处理就是当异常发生时,对异常处理的方式
异常处理的方式
- try-catch-finally:程序员在代码中捕获发生的异常,自行处理
- throws:将发生的异常抛出。交给调用者(方法)来处理,最顶级的处理者就是JVM
异常处理的示意图
try-catch 异常处理
- 基本介绍:Java提供try和catch块来处理异常。try块用于包含可能出错的代码,catch块用于处理try块中发生的异常,可以根据需要在程序中有多个try-catch块
- 基本语法
try{
//可疑代码
//将异常生成对应的异常对象,传递给catch块
}catch(异常){
//对异常的处理
}
//如果没有finally,语法是可以通过的
public class ExceptionExcerise {public static void main(String[] args) {int num1 = 10;int num2 = 0;int res = 0;try {res = num1/num2;} catch (Exception e) {System.out.println(e.getMessage());//输出具体的错误}}
}
结果
- try-catch 方式处理异常-注意事项
1,如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块
2,如果异常没有发生,则顺序执行try的代码块,不会进入到catch
3,如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等),则使用如下代码-finally
public class ExceptionExcerise {public static void main(String[] args) {//异常处理快捷键:ctrl + atl + t//1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块//2. 如果异常没有发生,则顺序执行 try 的代码块,不会进入到 catch//3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finallytry {String str = "zl";int a = Integer.parseInt(str);System.out.println("数字:"+a);//不会执行} catch (NumberFormatException e) {System.out.println("异常信息="+e.getMessage());} finally {System.out.println("代码块被执行");//一定会执行}System.out.println("程序继续");}
}
结果
4,可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException在前),如果发生异常,只会匹配一个catch
public class ExceptionExcerise {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} catch (ArithmeticException e ){System.out.println("算术异常="+e.getMessage());}catch (Exception e){System.out.println(e.getMessage());}finally {}}
}
class Person{private String name = "Jack";public String getName() {return name;}
}
结果
5,可以进行try-finally配合使用,这种永达相当于没有捕获异常,因此程序会直接崩溃退出。
- try-catch-finally 执行顺序小结
1,如果没有出现异常,则执行try块中所有语句,不知执行catch块中语句,如果有finally,最后还需执行finally,最后还租要执行finally中的语句
2,如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需执行finally里面的语句!
throws异常处理
- 基本介绍
1,如果一个方法中的语句执行时,可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示的声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
2,在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类 - 注意事项
1,对于编译异常,程序中必须处理,比如try-catch或throws
2,对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
3,子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类
4,在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws
public class ExceptionExcerise {public static void main(String[] args) {f2();}public static void f2()/*throws ArithmeticException */{//对于运行时异常,程序中如果没有处理,默认就是throws 的方式处理int n1 = 10;int n2 = 0;double res = n1/n2;}public static void f1()throws FileNotFoundException {//调用 f3() 报错//1. 因为 f3() 方法抛出的是一个编译异常//2. 即这时,就要 f1() 必须处理这个编译异常//3. 在 f1() 中,要么 try-catch-finally ,或者继续 throws 这个编译异常f3();//抛出异常}public static void f3()throws FileNotFoundException {FileInputStream fileInputStream = new FileInputStream("C:\\Users\\13627\\Desktop\\照片");//编译异常,文件不存在}public static void f4(){//1. 在 f4()中调用方法 f5() 是 OK//2. 原因是 f5() 抛出的是运行异常//3. 而 java 中,并不要求程序员显示处理,因为有默认处理机制f5();}public static void f5()throws ArithmeticException{}
}
class Father{public void method()throws RuntimeException{}
}
class Son extends Father{//子类重写父类的方法时,对抛出异常的规定:// 子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型@Overridepublic void method()throws ArithmeticException {}
}
结果
自定义异常
- 基本概念
当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息 - 自定义异常的步骤
1,定义类:自定义异常类名(自己写)继承Exception或RuntimeException
2,如果继承Exception,属于编译异常
3,如果继承RuntimeException,属于运行异常(通常情况下,继承RuntimeException)
实例:
public class ExceptionExcerise01 {public static void main(String[] args) /*throws AgeException*/{int age = 180;//要求范围在 18 – 120 之间,否则抛出一个自定义异常if (!(age>=18&&age<=120)){//这里我们可以通过构造器,设置信息throw new AgeException("年龄需要在18-120之间");}System.out.println("你的年龄在正常范围");}
}/*** 自定义一个异常* 1,通常情况下,我们自定义异常是继承RuntimeException* 2,即把自定义异常做成 运行时异常,好处时,我们可以使用默认的处理机制* 3,也就是比较方便*/
class AgeException extends RuntimeException{public AgeException(String message) {//构造器super(message);}
}
结果
更改年龄
public class ExceptionExcerise01 {public static void main(String[] args) /*throws AgeException*/{int age = 100;//要求范围在 18 – 120 之间,否则抛出一个自定义异常if (!(age>=18&&age<=120)){//这里我们可以通过构造器,设置信息throw new AgeException("年龄需要在18-120之间");}System.out.println("你的年龄在正常范围");}
}/*** 自定义一个异常* 1,通常情况下,我们自定义异常是继承RuntimeException* 2,即把自定义异常做成 运行时异常,好处时,我们可以使用默认的处理机制* 3,也就是比较方便*/
class AgeException extends RuntimeException{public AgeException(String message) {//构造器super(message);}
}
结果
throw和throws的区别
相关文章:

异常-Exception
异常介绍 基本概念 Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)执行过程中所发生的异常事件可分为两大类 1,Error(错误):Java虚拟机无法…...

ctfshow——SQL注入
文章目录 SQL注入基本流程普通SQL注入布尔盲注时间盲注报错注入——extractvalue()报错注入——updataxml()Sqlmap的用法 web 171——正常联合查询web 172——查看源代码、联合查询web 173——查看源代码、联合查询web 174——布尔盲注web 176web 177——过滤空格web 178——过…...

第十三章 计算机网络
这里写目录标题 1.网络设备2.协议簇2.1电子邮件(传输层)2.2地址解析(网际层)2.3DHCP(动态主动配置协议)2.4URL(统一资源定位器)2.5IP地址和子网掩码 1.网络设备 物理层:中继器,集线器(多路中继器) 数据链路层:网桥,交换机(多端口…...
商品详情 API 返回值说明
商品详情API接口在多个领域和场景中都有广泛的应用,以下是一些常见的应用场景: 竞品分析:企业可以利用商品详情API接口获取竞品的所有详细信息,如价格、发货地、上架时间、销售量等。通过分析这些竞品信息,企业可以更…...

层级实例化静态网格体组件:开启大量模型处理之门
前言 在数字孪生的世界里,我们常常需要构建大量的模型来呈现真实而丰富的场景。然而,当使用静态网格体 (StaticMesh )构建大量模型时,可能会遇到卡顿的问题,这给我们带来了不小的困扰😣。那么&…...

【网络知识】光猫、路由器 和 交换机 的作用和区别?
数字信号:是指自变量是离散的、因变量也是离散的信号,这种信号的自变量用整数表示,因变量用有限数字中的一个数字来表示。在计算机中,数字信号的大小常用有限位的二进制数表示。 模拟信号:模拟信号是指用连续变化的物…...
初识Electron,创建桌面应用
历史小剧场 呜呼!古有匈奴犯汉,晋室不纲,铁木夺宋,虏清入关,神舟陆沉二百年有余,中国之见灭于满清初非满人能灭之,能有之也因有汉奸以作虎怅,残同胞媚异种,始有吴三桂洪承…...

AI编码时代到来?实现编程梦想的利器—Baidu Comate测评
文章目录 Comate智能编码是什么?Comate支持的环境 Comate应用安装实际操作对话式生成代码生成代码注释智能单测项目测试调优功能 总结 Comate智能编码是什么? 在如今这个拥抱AI的时代,市面上已经产出了很多Ai代码助手,如果你还没…...
去中心化自治组织(DAO)
文章目录 一、DAO (Decentralized Autonomous Organization) 去中心化自治组织 二、举例说明 1、例子1 2、例子2 总结 一、DAO (Decentralized Autonomous Organization) 去中心化自治组织 DAO是一种基于区块链平台上的组织结构,它通过智能合约来实现组织的…...

MySQL之多表查询
1. 前言 多表查询,也称为关联查询.指两个或两个以上的表一起完成查询操作.前提条件 : 这些一起查询的表之间是有关系的(一对一/一对多).他们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键. 2. 笛卡尔积现象(交叉连接…...
极端天气频发,我们普通人如何保全自己
随着全球气候变暖的加剧,极端天气事件如同一位不请自来的“不速之客”,频繁地闯入我们的生活。暴风雨、暴风雪、台风、干旱、热浪等极端天气现象,不仅给人们的生命和财产安全带来了前所未有的挑战,更对社会的正常秩序构成了严重威…...

直面市场乱价,品牌商家该如何解决?
在当今的商业世界中,品牌商面临着一系列严峻挑战,其中如何有效管理经销商价格是一个关键难题。经销商随意调整价格的行为,不仅会损害品牌的信誉与形象,还可能导致市场秩序混乱,使品牌利润大幅缩水。因此,采…...

Spring中的Bean相关理解
在Spring框架中,Bean是一个由Spring IoC容器实例化、配置和管理的对象。Bean是一个被Spring框架管理并且被应用程序各个部分所使用的对象。Spring IoC容器负责Bean的创建、初始化、依赖注入以及销毁等生命周期管理。 注:喜欢的朋友可以关注公众号“JAVA学…...

操作系统实战(二)(linux+C语言)
实验内容 通过Linux 系统中管道通信机制,加深对于进程通信概念的理解,观察和体验并发进程间的通信和协作的效果 ,练习利用无名管道进行进程通信的编程和调试技术。 管道pipe是进程间通信最基本的一种机制,两个进程可以通过管道一个在管道一…...
哪些情况下会触发MySQL的预读机制?
MySQL的预读机制主要与其底层存储引擎的实现有关,尤其是InnoDB存储引擎。预读(Pre-reading)或预取(Prefetching)是一种性能优化技术,其中数据库系统主动读取可能很快就会被查询到的数据页到缓冲池ÿ…...
react使用谷歌人机验证
在项目中,需要对请求验证,防止被爆破,这里使用的是谷歌的recaptcha-v3。 1.申请谷歌人机验证的api 申请链接,申请完后需要将两个谷歌颁发的key分别写入前,后端的配置环境中,后面会使用. 2.前端部分 前端使用的是viteC…...

java JMH 学习
JMH 是什么? JMH(Java Microbenchmark Harness)是一款专用于代码微基准测试的工具集,其主要聚焦于方法层面的基准测试,精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写,他们对 JIT 及…...

本地运行AI大模型简单示例
一、引言 大模型LLM英文全称是Large Language Model,是指包含超大规模参数(通常在十亿个以上)的神经网络模型。2022年11月底,人工智能对话聊天机器人ChatGPT一经推出,人们利用ChatGPT这样的大模型帮助解决很多事情&am…...
图像处理:时域、空域、频率的滤波介绍
首先要搞清楚为什么会呈现出不同域的维度,来理解和处理图像,原因是图像的构成有多个维度的信息特点。比如一段视频从时间顺序来看,相邻的2个图像帧绝大部分信息是相同的,这就构成了前向预测的理论基础;比如一帧图像从空…...

TC8002D 是一颗带关断模式的音频功放IC
一、一般概述 TC8002D是一颗带关断模式的音频功放IC。在5V输入电压下工作时,负载(3Ω)上的平均功率 为3 W,且失真度不超过10%。而对于手提设备而言,当VDD作用于关断端时,TC8002D将会进入关断模式,此时的功耗极…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...