当前位置: 首页 > news >正文

异常的讲解(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)如果一个方法(中的语句执行时)可能生成某种异常&#xff0c;但是…...

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日消息&#xff0c;据中国移动通信联合会元宇宙产业工作委员会网站&#xff0c;中国移动通信联合会元宇宙产业工作委员会、中国通信工业协会区块链专业委员会等&#xff0c;共同发布“关于元宇宙生成式人工智能&#xff08;类 ChatGPT&#xff09;应用的行业提示”。提示内…...

轻松掌握Qt FTP 机制:实现高效文件传输

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

用AI帮我写一篇关于FPGA的文章,并推荐最热门的FPGA开源项目

FPGA定义 FPGA&#xff08;Field Programmable Gate Array&#xff09;是一种可编程逻辑器件&#xff0c;可以在硬件电路中实现各种不同的逻辑功能。与ASIC&#xff08;Application Specific Integrated Circuit&#xff0c;特定应用集成电路&#xff09;相比&#xff0c;FPGA…...

从兴趣或问题出发

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

C++ | 探究拷贝对象时的一些编译器优化

&#x1f451;作者主页&#xff1a;烽起黎明 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;C 文章目录前言一、传值传参二、传引用传参三、传值返回拷贝构造和赋值重载的辨析四、传引用返回【❌】五、传匿名对象返回六、总计与提炼前言 在传参…...

linux工具gcc/g++/gdb/git的使用

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

Direct3D 12——纹理——纹理

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

产品经理必读 | 俞军产品经理十二条军规

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

【机器视觉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 过渡和动画详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 过度和动画概述1.1过度和动画的简介二、Vue 3 过度2…...

基于多种流量检测引擎识别pcap数据包中的威胁

在很多的场景下&#xff0c;会需要根据数据包判断数据包中存在的威胁。针对已有的数据包&#xff0c;如何判断数据包是何种攻击呢&#xff1f; 方法一可以根据经验&#xff0c;对于常见的WEB类型的攻击&#xff0c;比如SQL注入&#xff0c;命令执行等攻击&#xff0c;是比较容…...

第02章_变量与运算符

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

仅三行就能学会数据分析——Sweetviz详解

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

springboot——集成elasticsearch进行搜索并高亮关键词

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

MATLAB绘制局部放大图

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

第十三天缓存一致性篇

目录 一、缓存的应用场景 二、缓存数据一致性如何保证&#xff1f; 三、缓存的最终一致性解决方案&#xff1a; 一、缓存的应用场景 1、缓存中的数据不应该是实时性一致性要求超高的&#xff0c; 通过缓存加上过期时间保证每天拿到的数据都是最新的即可。 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 框架表示法人工智能专题-知识表示 大纲 大纲&#xff1a;掌握知识表示方…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

Git 命令全流程总结

以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结&#xff0c;按操作场景分类整理&#xff1a; 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...

ABAP设计模式之---“Tell, Don’t Ask原则”

“Tell, Don’t Ask”是一种重要的面向对象编程设计原则&#xff0c;它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则&#xff1f; 这个原则的核心思想是&#xff1a; “告诉一个对象该做什么&#xff0c;而不是询问一个对象的状态再对它作出决策。…...