异常的讲解(2)
目录
throws异常处理
基本介绍
throws异常处理注意事项和使用细节
自定义异常
基本概念
自定义异常的步骤
throw 和throws的区别
本章作业
第一题
第二题
第三题
第四题
throws异常处理
基本介绍
1)如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
2)在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
代码演示:
小细节:可以直接使用快捷键alt+Enter
package idea.chapter12.throws_;import java.io.FileInputStream;
import java.io.FileNotFoundException;public class Throws01 {public static void main(String[] args) {}public void f2() throws FileNotFoundException, NullPointerException, ArithmeticException {//这里我们创建了一个文件流对象//1. 这里的异常是一个FileNotFoundException 编译异常//2. 使用前面讲过的 try-catch-finally//3. 使用throws ,抛出异常, 让调用f2方法的调用者(方法)处理//4. throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类 也可以写Exception因为Exception是FileNotFoundException的父类//5. throws 关键字后也可以是 异常列表, 即可以抛出多个异常FileInputStream fis = new FileInputStream("d://aa.txt");}
}
throws异常处理注意事项和使用细节
1)对于编译异常,程序中必须处理,比如 try-catch或者throws
2)对于运行时异常,程序中如果没有处理,默认就是throws的方式处理[举例]
3)子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型[举例]
4)在throws 过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws
代码演示:
package idea.chapter12.throws_;import java.io.FileInputStream;
import java.io.FileNotFoundException;public class ThrowsDetail {public static void main(String[] args) {f2();}//如果没有try-catch 相当于有默认的一个throws ArithmeticExceptionpublic static void f2() /*throws ArithmeticException*/ {//1.对于编译异常,程序中必须处理,比如 try-catch 或者 throws//2.对于运行时异常,程序中如果没有处理,默认就是throws的方式处理int n1 = 10;int n2 = 0;double res = n1 / n2;}public static void f1() throws FileNotFoundException {//这里调用f3() 报错//1. 因为f3() 方法抛出的是一个编译异常,而f1()调用了f3()因为f3的异常是一个编译异常所以必须要处理//2. 就要f1() 必须处理这个编译异常//3. 在f1() 中,要么 try-catch-finally ,或者继续throws 这个编译异常f3(); // 抛出异常}public static void f3() throws FileNotFoundException {FileInputStream fis = new FileInputStream("d://aa.txt");}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 {//子类//3. 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,// 所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型//4. 在throws 过程中,如果有方法 try-catch , 就相当于处理异常,就可以不必throws@Overridepublic void method() throws ArithmeticException {}
}
自定义异常
基本概念
当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。
自定义异常的步骤
1)定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
2)如果继承Exception,属于编译异常
3)如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)
代码演示:
package idea.chapter12.customexception_;/*
自定义异常
当我们接收Person对象年龄时,要求范围在18-120之间,否则抛出一个
自定义异常(要求 继承RuntimeException),并给出提示信息。*/
public class CustomException {public static void main(String[] args) {int age = 90;if (!(age > 18 && age < 120)) {//这里可以用过构造器指定信息throw new a("你输入的年龄有误");}System.out.println("你输入的年龄正确");}
}//自定义一个异常
// 1. 一般情况下,我们自定义异常是继承 RuntimeException
//2. 即把自定义异常做成 运行时异常,好处时,我们可以使用默认的处理机制
class a extends RuntimeException {public a(String message) {super(message);}
}
throw 和throws的区别
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
思路分析:
1.首先我们先调用静态方法methodA() 在该方法中,会先去执行System.out.println("进入方法A");这句话 紧接着我们自己手动制造了一个异常,所以不会继续往下执行,而是先执行finally中的代码然后在执行catch中的代码,当我们制造了一个异常之后,相当于这个方法就会抛出一个异常,会被exception捕获,所以打印出第三局话 2.因为有我们使用了try-catch 处理了,所以程序不会崩溃,会继续往下执行,所以执行methodB()方法,所以会输出第四句话, System.out.println("进入方法B");因为没有异常,接下来的代码是return 但是因为finally中代码还没有执行,所以不会先去执行return 而是先执行finally中的代码,再去执行return
package idea.chapter12.throws_;public class ThrowException {public static void main(String[] args) {try {ReturnExceptionDemo.methodA();} catch (Exception e) {System.out.println(e.getMessage());}ReturnExceptionDemo.methodB();}
}
/*
思路分析:
1.首先我们先调用静态方法methodA() 在该方法中,会先去执行System.out.println("进入方法A");这句话 紧接着我们自己手动制造了一个异常,所以不会继续往下执行,而是先执行finally中的代码然后在执行catch中的代码,当我们制造了一个异常之后,相当于这个方法就会抛出一个异常,会被exception捕获,所以打印出第三局话
2.因为有我们使用了try-catch 处理了,所以程序不会崩溃,会继续往下执行,所以执行methodB()方法,所以会输出第四句话, System.out.println("进入方法B");因为没有异常,接下来的代码是return 但是因为finally中代码还没有执行,所以不会先去执行return 而是先执行finally中的代码,再去执行return*/
class ReturnExceptionDemo {static void methodA() {try {System.out.println("进入方法A");//1throw new RuntimeException("制造异常");//3} finally {System.out.println("用A方法的finally");//2 因为finally必须被执行所以优先执行finally 在回去抛出异常}}static void methodB() {try {System.out.println("进入方法B");//4return;} finally {System.out.println("调用B方法的finally");//5}}
}
本章作业
第一题
代码演示:
package idea.chapter12.homework;/*
1.编程题Homework01.java
a)编写应用程序EcmDef.java,接收命令行的两个参数(整数),计算两数相除。
b)计算两个数相除,要求使用方法cal(int n1,int n2)
c)对数据格式不正确、缺少命令行参数、除0进行异常处理。*/
public class Homework01 {public static void main(String[] args) {try {if (args.length != 2) {//先判断个数对不对,如果不对手动抛出异常throw new ArrayIndexOutOfBoundsException("参数个数不对");}int n1 = Integer.parseInt(args[0]);int n2 = Integer.parseInt(args[1]);//因为cal方法可能会抛出多个异常,所以将可能发生的异常都列出来double res = cal(n1, n2);System.out.println("res=" + res);} catch (ArrayIndexOutOfBoundsException e) {throw new RuntimeException(e.getMessage());} catch (NumberFormatException e) {System.out.println("数据格式不对");} catch (ArithmeticException e) {System.out.println("算术异常");}}public static double cal(int n1, int n2) {return n1 / n2;}
}
第二题
思路分析:
1.第一个可能发生的异常是NullPointerException也就是空指针异常,因为如果我们没有给数组任何数组的话,那么就会抛出空指针异常 2.还可能抛出数组下标越界异常ArrayIndexOutOfBoundsException 因为如果数组的长度如果只要2,但是却访问的是4这个元素 3.还会有一个类型转换异常 因为String和Integer没有任何的关系
package idea.chapter12.homework;public class Homework02 {public static void main(String[] args) {/*思路分析:1.第一个可能发生的异常是NullPointerException也就是空指针异常,因为如果我们没有给数组任何数组的话,那么就会抛出空指针异常2.还可能抛出数组下标越界异常ArrayIndexOutOfBoundsException 因为如果数组的长度如果只要2,但是却访问的是4这个元素3.还会有一个类型转换异常 因为String和Integer没有任何的关系*///args.length = 0//这里发生的是 ArrayIndexOutOfBoundsException//如果数组个数为0会发生数组下标越界异常ArrayIndexOutOfBoundsExceptionif (args[4].equals("john")) { //如果args[4]为空可能发生NullPointerExceptionSystem.out.println("AA");} else {System.out.println("BB");}Object o = args[2]; //String->Object ,向上转型Integer i = (Integer) o; //错误,这里一定会发生 ClassCastException 因为无法把一个String转成Integer 违反了向下转型的规则//**3)要求父类的引用必须指向的是当前目标类型的对象**}
}
第三题
思路分析:
1.程序会先去执行我们的func方法,在该方法中,我们手动的抛出了一个异常,那么相当于我们的func()这个方法有一个异常,就会被catch捕获,但是要注意因为有finally代码块,因为finally是必须执行的,所以会先输出B 然后因为func方法抛出了异常,那么try中的代码就不会继续往下执行,因此A不会输出而且是去执行catch中的代码,执行完后,在执行finally中的代码输出C 2.所以最后输出的结果是,B C D
package idea.chapter12.homework;public class Homework03 {public static void func() {//静态方法try {throw new RuntimeException();} finally {System.out.println("B");}}
/*
思路分析:
1.程序会先去执行我们的func方法,在该方法中,我们手动的抛出了一个异常,那么相当于我们的func()这个方法有一个异常,就会被catch捕获,但是要注意因为有finally代码块,因为finally是必须执行的,所以会先输出B 然后因为func方法抛出了异常,那么try中的代码就不会继续往下执行,因此A不会输出而且是去执行catch中的代码,执行完后,在执行finally中的代码输出C
2.所以最后输出的结果是,B C D*/public static void main(String[] args) {//main方法try {func();System.out.println("A");//因为func方法中发生了异常所以这句话不会执行} catch (Exception e) {System.out.println("C");}System.out.println("D");}
}
第四题
思路分析:
1.首先会去执行我们showExce()方法,因为在该方法中,手动抛出了一个异常,相当于showExce方法有一个异常,就会被catch捕获所以try中的代码就不会继续往下执行,而是去执行catch中的代码输出B 然后执行finally中的代码,执行完finally中代码,在输出D 2.因为我们的程序使用了try-catch处理 ,因此抛出异常后,程序不会直接崩溃
package idea.chapter12.homework;public class Homework04 {public static void main(String[] args) {//main方法try {showExce();System.out.println("A");//因为在showExce()方法中发生了异常所以这句话不会执行} catch (Exception e) {System.out.println("B");} finally {System.out.println("C");}System.out.println("D");}
/*
思路分析:
1.首先会去执行我们showExce()方法,因为在该方法中,手动抛出了一个异常,相当于showExce方法有一个异常,就会被catch捕获所以try中的代码就不会继续往下执行,而是去执行catch中的代码输出B 然后执行finally中的代码,执行完finally中代码,在输出D
2.因为我们的程序使用了try-catch处理 ,因此抛出异常后,程序不会直接崩溃 */public static void showExce() throws Exception {throw new Exception();}}
相关文章:

异常的讲解(2)
目录 throws异常处理 基本介绍 throws异常处理注意事项和使用细节 自定义异常 基本概念 自定义异常的步骤 throw 和throws的区别 本章作业 第一题 第二题 第三题 第四题 throws异常处理 基本介绍 1)如果一个方法(中的语句执行时)可能生成某种异常,但是…...

jvm内存结构
1. 栈 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 1.2栈内存溢出 栈帧过多导致栈内存溢出 /*** 演示栈内存溢出 java.lang.StackOverflowError* -Xss256k*/ public class Demo1_2 {private static int count;public static void main(String[] args) {try {meth…...

要刹车?生成式AI迎新规、行业连发ChatGPT“警报”、多国考虑严监管
4月13日消息,据中国移动通信联合会元宇宙产业工作委员会网站,中国移动通信联合会元宇宙产业工作委员会、中国通信工业协会区块链专业委员会等,共同发布“关于元宇宙生成式人工智能(类 ChatGPT)应用的行业提示”。提示内…...

轻松掌握Qt FTP 机制:实现高效文件传输
轻松掌握Qt FTP:实现高效文件传输一、简介(Introduction)1.1 文件传输协议(FTP)Qt及其网络模块(Qt and its Network Module)QNetwork:二、QNetworkAccessManager上传实例(Qt FTP Upl…...

用AI帮我写一篇关于FPGA的文章,并推荐最热门的FPGA开源项目
FPGA定义 FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,可以在硬件电路中实现各种不同的逻辑功能。与ASIC(Application Specific Integrated Circuit,特定应用集成电路)相比,FPGA…...

从兴趣或问题出发
当我们还沉寂在移动互联网给生活带来众多便利中,以 ChartGPT 为代表的 AI 时代已彻底到来。科技的发展,时刻在改变着我们的生活,我们需要不断地学习新知识和掌握新技能才能享受变化带来的便利,以及自身不被社会淘汰。 因此&#…...

C++ | 探究拷贝对象时的一些编译器优化
👑作者主页:烽起黎明 🏠学习社区:烈火神盾 🔗专栏链接:C 文章目录前言一、传值传参二、传引用传参三、传值返回拷贝构造和赋值重载的辨析四、传引用返回【❌】五、传匿名对象返回六、总计与提炼前言 在传参…...

linux工具gcc/g++/gdb/git的使用
目录 gcc/g 基本概念 指令集 函数库 (重要) gdb使用 基本概念 指令集 项目自动化构建工具make/makefile 进度条小程序 编辑 git三板斧 创建仓库 git add git commit git push git status git log gcc/g 基本概念 gcc/g称为编译器…...

Direct3D 12——纹理——纹理
纹理不同于缓冲区资源,因为缓冲区资源仅存储数据数组,而纹理却可以具有多个mipmap层级(后 文有介绍),GPU会基于这个层级进行相应的特殊操作,例如运用过滤器以及多重采样。支持这些特殊 的操作纹理资源都被限定为一些特定的数据格式…...

产品经理必读 | 俞军产品经理十二条军规
最近在学习《俞军产品方法论》,觉得俞军总结的十二条产品经理原则非常受用,分享给大家。 01. 产品经理首先是产品的深度用户 自己设计的产品都没使用过的产品经理,如何明白用户使用的问题,如何解决问题,所以产品经理肯…...

【机器视觉1】光源介绍与选择
文章目录一、常见照明光源类型二、照明光源对比三、照明技术3.1 亮视野与暗视野3.2 低角度照明3.3 前向光直射照明3.4 前向光漫射照明3.5 背光照明-测量系统的最佳选择3.6 颜色与补色示例3.7 偏光技术应用四、镜头4.1 镜头的几个概念4.2 影响图像质量的关键因素4.3 成像尺寸4.4…...

【三十天精通Vue 3】第十一天 Vue 3 过渡和动画详解
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 过度和动画概述1.1过度和动画的简介二、Vue 3 过度2…...

基于多种流量检测引擎识别pcap数据包中的威胁
在很多的场景下,会需要根据数据包判断数据包中存在的威胁。针对已有的数据包,如何判断数据包是何种攻击呢? 方法一可以根据经验,对于常见的WEB类型的攻击,比如SQL注入,命令执行等攻击,是比较容…...

第02章_变量与运算符
第02章_变量与运算符 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 关键字(keyword) 定义:被Java语言赋予了特殊含义,用做专门…...

仅三行就能学会数据分析——Sweetviz详解
文章目录前言一、准备二、sweetviz 基本用法1.引入库2.读入数据3.调整报告布局总结前言 Sweetviz是一个开源Python库,它只需三行代码就可以生成漂亮的高精度可视化效果来启动EDA(探索性数据分析)。输出一个HTML。 如上图所示,它不仅能根据性别、年龄等…...

springboot——集成elasticsearch进行搜索并高亮关键词
目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮关键词 1.elasticsearch概述 (1)是什么: Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。 Lucene 可以被认为是迄今为止最先进、性能最好的…...

MATLAB绘制局部放大图
MATLAB绘制局部放大图 1 工具准备 MATLAB官网-ZoomPlot(Kepeng Qiu. Matlab Central, 2022) 初始数据图绘制完成后,调用以下代码: %% 添加局部放大 zp BaseZoom(); zp.plot;1.1 具体绘制步骤 具体绘制步骤如下: 通过鼠标左键框选作图区…...

第十三天缓存一致性篇
目录 一、缓存的应用场景 二、缓存数据一致性如何保证? 三、缓存的最终一致性解决方案: 一、缓存的应用场景 1、缓存中的数据不应该是实时性一致性要求超高的, 通过缓存加上过期时间保证每天拿到的数据都是最新的即可。 2、如果实时性要求…...

VSCode使用Remote SSH远程连接Linux服务器【远程开发】
文章目录前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar4.2 创建隧道映射4.3 测试公网远程连接5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程转发自CSDN远…...

人工智能专题-知识表示
文章目录人工智能专题-知识表示大纲2.1 知识表示的概念2.1.1 知识表示观点2.1.2 知识表示的要求2.2 一阶谓词逻辑表示法2.2.1 一阶谓词概念2.2.2 谓词逻辑表示方法2.3 产生式表示法2.4 语义网络表示法2.5 框架表示法人工智能专题-知识表示 大纲 大纲:掌握知识表示方…...

各种过滤器使用场景
授权过滤器的使用场景有以下几种: 判断用户是否登录或具有访问权限,如使用Authorize特性来限制只有通过身份验证的用户才能访问某些控制器或操作方法。 实现自定义的授权逻辑,如根据用户的角色、权限、IP地址等来决定是否允许访问。 实现一…...

第04章_IDEA的安装与使用(下)
第04章_IDEA的安装与使用(下) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 8. 快捷键的使用 8.1 常用快捷键 见《尚硅谷_宋红康_IntelliJ IDEA 常用快捷键一览表.md》…...

2023年全国最新道路运输从业人员精选真题及答案51
百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 7.A危险货物运输企业一辆载有甲醇的罐式车辆,在晚上…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK显示Bayer彩色格式的图像(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK显示Bayer彩色格式的图像(C#)Baumer工业相机Baumer工业相机的Bayer彩色图像的技术背景Baumer工业相机通过BGAPI SDK在回调函数里显示Bayer彩色图像Baumer工业相机在BufferEvent显示Bayer彩色图像Baumer工业相…...

Unity云渲染,加移动
上次我们根据官方所推出的教程,完成了云渲染,这次我们加个移动。 原谅我又水一篇文章😄😄😄😄😄😄😄😄😄 云渲染的文章看这里:Unity…...

ASP一个简单的网上教务系统模型的设计与实现
对于一个学校来说,大量教师信息,学生信息管理,学生成绩管理,基本数据的维护都难于通过传统的方法进行管理:这就迫切需要利用计算机技术来帮助学校管理者处理这些日常管理。本系统正是为了简化教学任务的管理࿰…...

黑马点评实战篇问题总结
缓存穿透 用户查询的数据在缓存和数据库中都不存在 这样的请求每次都会打到数据库上 解决方案: 1.缓存空字符串(额外的内存消耗,可能造成短期的不一致) 2.布隆过滤(内存占用少,没有多余key,实现…...

C++ 并发编程
文章目录基本概念编程创建线程启动共享数据相关条件变量时间相关future相关——等待一次性事件读写锁原子操作与缓存一致性关系线程管理启动线程从类的方法来创建线程传参标识线程常用API等待线程完成后台运行线程移动线程间共享数据互斥量(mutex)unique…...

5V的LDO电源的WCCA分析-可靠性分析计算过程
WCCA(WorstCase Circuit Analysis)分析方法是一种电路可靠性分析设计技术,用来评估电路中各个器件同时发生变化时的性能,用于保证设计电路在整个生命周期的都可以可靠工作。通过WCCA分析,验证在上述参数在其容差范围内发生变化时,…...

TensorFlow 深度学习第二版:6~10
原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只…...