异常 Exception 02

异常 Exception 02

  • 六、异常处理
    • 1、基本介绍
    • 2、异常处理的方式
    • 3、示意图
  • try-catch
  • throws
    • 1、介绍
    • 2、注意事项
  • 自定义异常
    • 1、基本概念
    • 2、自定义异常的步骤
    • 3、实例
    • 4、throw和throws的区别

六、异常处理

1、基本介绍

异常处理就是当异常发生时,对异常处理的方式。

2、异常处理的方式

  1. try-catch-finally
    程序员在代码中捕获发生的异常,自行处理
  2. throws
    将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是 JVM

3、示意图

(1) try-catch-finally 处理机制

	try {
	
		代码/可能有异常
		
	} catch(Exception e) {
	
		捕获到异常
		1、当异常发生时
		2、系统将异常封装成 Exception 对象e,传递给catch
		3、得到异常对象后,程序员自己处理
		4、注意,如果没有发生异常,catch代码块不执行
	
	} finally {
	
		1、不管try代码块是否有异常发生,都要执行finally
		2、所以,通常将释放资源的代码放在finally
	
	}

(2)throws 处理机制图

JVM 调用main方法,main调用 f1,f1 中 调用 f2,f2 抛出(发生)异常。
f2 抛出异常可以使用 ① try-catch-finally ② throws 机制,扔出去,f2 说它不管,抛给 f1(因为是 f1 调用它的),
f1也有两种选择,它也可以继续丢出去 throws。
扔给JVM,处理异常非常暴力,直接①输出异常信息 ②退出程序。
在这里插入图片描述

(1)try-catch-finally 和 throws 二选一
(2)如果程序员,没有显式处理异常,默认throws

在这里插入图片描述

try-catch

  1. Java提供 try 和 catch 块来处理异常。try 块用于包含可能出错的代码。catch 块用于处理 try 块中发生的异常。可以根据需要在程序中有多个 try…catch 块。finally 可写可不写。
  2. 基本语法
try {
	可疑代码
	将异常生成对应的异常对象,传递给catch} catch(异常){
	对异常的处理
}
没有finally也是可以滴
  1. IDEA中的快捷键

CTRL + ALT + T

  1. 【重要】注意事项
    ① 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块。【案例A】
    ② 如果异常没有发生,则顺序执行try的代码块,不会进入到catch。
    ③ 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等) 则使用如下代码 - finally {}。
    ④ 可以有多个catch语句,捕获不同的异常(进行不同的业务处理,要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException 在前),如果发生异常,只会匹配一个catch。【案例B】
    ⑤ 可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接退出/崩掉。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。

【举例A】

public static void main(String[] args) {
      try {
           String str = "XXXXXXX";
           System.out.println("=========");
           int a = Integer.parseInt(str);
           System.out.println("+++++++++");
           System.out.println("数字:" + a);
       } catch (NumberFormatException e) {
           e.printStackTrace();
       }
}

int a = Integer.parseInt(str);这句话会报错,直接跳到 catch块
在这里插入图片描述
【举例B】

public class TryCatchDetail02 {
    public static void main(String[] args) {
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName());//NullPointerException
            int n1 = 10;
            int n2 = 0;
            int res = n1/n2;//ArithmeticException
        } catch (NullPointerException e) {
            System.out.println("空指针异常=" + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("算数异常=" + e.getMessage());
        } catch (Exception e) {
            //Exception是 NullPointerException 和ArithmeticException的父类
            System.out.println(e.getMessage());
        } finally {

        }
    }
}

class Person {
    private String name = "jack";

    public String getName() {
        return name;
    }
}

throws

1、介绍

  1. 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些·异常进行处理,而由该方法的调用者负责处理。
  2. 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异
    常类型可以是方法中产生的异常类型,也可以是它的父类。
public class Throws01 {
    public static void main(String[] args) {

    }
    public void f2() throws FileNotFoundException {
//        创建了一个文件对象
        FileInputstream fis = new FileInputStream("d ://aa.txt");
    }
}

说明:
① 这里的异常:编译异常 FileNotFoundException(后面学到 IO)
② 使用throws,【throws FileNotFoundException】 抛出异常,让调用f2()的方法处理。
③ throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。解释: FileNotFoundException的父类是Exception,也可以写 【throws Exception】
④ 在方法声明中用throws语句可以声明抛出异常的列表
【throws FileNotFoundException,NullPointerException, ArithmeticException】

2、注意事项

  1. 对于编译异常,程序中必须处理,比如 try-catch 或者throws
  2. 对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
  3. 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型【案例A】
  4. 在throws过程中,如果有方法 try-catch,就相当于处理异常,就可以不必throws
  5. 【案例B】
  6. 【案例C】

【案例A】
子类重写的方法,所抛出的异常类型和父类抛出的异常一致

class Father {
    public void method() throws RuntimeException {
    }
}

class Son extends Father {
    @Override
    public void method() throws RuntimeException {
    }
}

这样也可以,子类重写的方法,所抛出的异常类型为父类抛出的异常的类型的子类型

class Father {
    public void method() throws Exception {
    }
}

class Son extends Father {
    @Override
    public void method() throws RuntimeException {
    }
}

【案例B】
在这里插入图片描述
f1 和 f3 都在相同的类里,且都是静态方法,按理来说可以直接调用。怎么在 f1 中调用 f3 报错??
分析:
FileNotFoundException是编译异常,f3 会抛出异常给调用它的 f1,但是在 f1 中没有处理。
因为f3()方法抛出的是一个编译异常。即这时,就要求 f1()必须处理这个编译异常。
解决方法 ① 让 f1 方法 throws ② try-catch

【案例C】

    public static void f4() {
        f5();
    }
    public static void f5() throws ArithmeticException {

    }

分析:
① 在 f4() 中调用方法 f5() 是OK
② 原因是 f5() 抛出的是运行异常
③ 而java中,并不要求程序员显示处理,因为有默认处理机制

自定义异常

1、基本概念

当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

2、自定义异常的步骤

  1. 定义类:自定义异常类名 (程序员自己写) 继承Exception或RuntimeException
  2. 如果继承 Exception,属于编译异常
  3. 如果继承 RuntimeException,属于运行异常(一般来说,继承RuntimeException)

3、实例

当我们接收Person对象年龄时,要求范围在18-120之间,否则抛出一个自定义异常(要求继承 RuntimeException),并给出提示信息。
CustomException.java

public class CustomException {
    public static void main(String[] args) {
        int age = 80;
        if(!(age >= 18 && age <=120)) {
            throw new AgeException("年龄要在 18-120之间。");
        }
        System.out.println("你的年龄输入正确。");
    }
}
class AgeException extends RuntimeException {
    public AgeException(String message) {
        super(message);
    }
}

① 一般情况下,我们自定义异常是继承RuntimeException
② 即把自定义异常做成运行时异常,好处时,我们可以使用默认的处理机制

4、throw和throws的区别

在这里插入图片描述

【例题】

public class ThrowException {
    public static void main(String[] args) {
        try {
            ReturnExceptionDemo.methodA();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        ReturnExceptionDemo.methodB();

    }
}

class ReturnExceptionDemo {
    static void methodA() {
        try {
            System.out.println("进入方法A");
            throw new RuntimeException("制造异常");
        } finally {
            System.out.println("用A方法的finally");
        }
    }

    static void methodB() {
        try {
            System.out.println("进入方法B");
            return;
        } finally {
            System.out.println("调用B方法的finally");
        }
    }
}

在这里插入图片描述
分析!!!!!

程序从main函数开始
【执行】ReturnExceptionDemo.methodA();
------------------------ReturnExceptionDemo------------------------------------
进入ReturnExceptionDemo类寻找静态方法methodA
【执行】System.out.println("进入方法A");
【输出1】进入方法A
【执行】throw new RuntimeException("制造异常");
抛出异常: new RuntimeException("制造异常") 进入类RuntimeException的构造方法,并且传递参数
进入源代码查看,发现RuntimeExceptionException的子类,ExceptionThrowable的子类。
Throwable源码:
{
    private String detailMessage;

    public Throwable(String message) {
        fillInStackTrace();
        detailMessage = message;
    }
}
此时 属性detailMessage = "制造异常";
【执行】finally中的内容
【输出2】用A方法的finally
【返回main函数】
------------------------------main函数------------------------------------------
main捕捉到了异常,进入catch
【执行】System.out.println(e.getMessage());
Throwable类中的源码为 :
public String getMessage() {
        return detailMessage;
    }
【输出3】制造异常
【执行】ReturnExceptionDemo.methodB();
------------------------ReturnExceptionDemo------------------------------------
【输出4】进入方法B
【输出5】调用B方法的finally

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

以STM32CubeMX创建DSP库工程方法一

以STM32CubeMX创建DSP库工程方法 略过时钟树的分配和UART的创建等&#xff0c;直接进入主题生成工程文件 它们中的文件功能如下&#xff1a; 1&#xff09;BasicMathFunctions 基本数学函数&#xff1a;提供浮点数的各种基本运算函数&#xff0c;如向量加减乘除等运算。 2&…

VBA代码解决方案第8讲:用FindPrevious进行重复搜索及利用LIKE查找

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

货代FOB条款卖方必备的知识:发货人都要承担哪些费用呢?

据统计&#xff0c;中国出口中以FOB成交的占到70%&#xff0c;但专家指出&#xff1a;FOB对出口商的风险更大&#xff0c;有可能造成货、款两空的结局。 目前我国出口合同以FOB价格条款成交的比例越来越大&#xff0c;而且收货人指定船公司的少&#xff0c;指定境外货代的多&am…

3款厉害的小工具,小黑子都在用!

大家好&#xff0c;我是 Javapub。 程序员与普通人最大的区别是什么&#xff0c;当然是会使用工具。基于一些同学经常问我的问题&#xff0c;接下来给大家分享几款我经常使用的工具&#xff0c;主打一个提升效率。 第一款 Everything 用 windwos 的同学都体会过&#xff0c;…

带大家做一个,易上手的家常土豆片

还是先从冰箱里那一块猪瘦肉 搞一点蒜和生姜 切成小块 装进一个碗里 这里一点就够了 一条绿皮辣椒 切片 三个左右干辣椒 随便切两刀 让它小一点就好了 一起装一个碗 一大一小两个土豆切片 猪肉切片 起锅烧油 然后 下肉翻炒 等肉变颜色捞出来 然后放入土豆 和小半碗水 让…

JeecgBoot低代码开发—Vue3版前端入门教程

JeecgBoot低代码开发—Vue3版前端入门教程 后端接口配置VUE3 必备知识1.vue3新特性a. https://v3.cn.vuejs.org/b.setup的用法c.ref 和 reactive 的用法d.新版 v-model 的用法e.script setup的用法 2.TypeScript基础 后端接口配置 如何修改后台项目路径 http://127.168.3.52:8…

【玩转 EdgeOne】| 腾讯云下一代边缘加速CDN EdgeOne 是安全加速界的未来吗?

目录 前言边缘加速与安全加固边缘计算与CDN的融合EdgeOne优秀的安全特性EdgeOne卓越的性能表现灵活的配置和管理生态系统的支持与发展技术创新与未来展望EdgeOne试用结束语 前言 在当下互联网的迅猛发展的时刻&#xff0c;云计算和边缘计算技术的快速发展为网络加速领域带来了…

awk从放弃到入门(10):awk内置函数

awk从放弃到入门&#xff08;10&#xff09;&#xff1a;awk内置函数 算数函数字符串函数其他函数 本博文转载自 这篇文章中的知识点是建立在前文的基础上的&#xff0c;如果你还没有掌握前文中的知识&#xff0c;请先参考之前的文章。 注&#xff1a;在阅读这篇文章之前&…

Abbyy FineReader16最新版本有哪些新功能?

在数字化时代&#xff0c;数据处理和转换变得非常重要&#xff0c;Abbyy FineReader 就是一款专门用于处理、转换和识别图像和 PDF 文件的软件。在本文中&#xff0c;我们将会详细介绍 Abbyy FineReader 的功能以及适合使用该软件的电脑。 ABBYY Finereader 16-安装包下载如下&…

滴滴2023.11.27P0级故障技术复盘回顾(k8s的的错?)

本文从滴滴官方恢复及技术公众号带大家从技术角度复盘这次事故 目录 1. 背景 2. 滴滴官方消息 3. 问题分析及定位 4.网传的k8s及解析 5.k8s引发的思考&#xff1a;举一反三&#xff0c;怎么避免再次出现 6.近段时间其他平台崩溃回顾 1. 背景 11 月 27 晚约 10 点&#xf…

TFIDF、BM25、编辑距离、倒排索引

TFIDF TF刻画了词语t对某篇文档的重要性&#xff0c;IDF刻画了词语t对整个文档集的重要性

最简单的链路追踪收集器

链路追踪可帮助您快速了解程序服务之间的调用关系&#xff0c;并快速洞悉内部发生的情况。主流的链路追踪系统有zipkin,jaeger,skywalking等&#xff0c;由于opentelemetry的存在&#xff0c;都具有opentelemetry的转换器。 我们利用opentelemetry来进行zipkin,jaeger,skywalk…

智能优化算法应用:基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.生物地理学算法4.实验参数设定5.算法结果…

在Rust中编写自动化测试

1.摘要 Rust中的测试函数是用来验证非测试代码是否是按照期望的方式运行的, 测试函数体通常需要执行三种操作:1.设置任何所需的数据或状态;2.运行需要测试的代码;3.断言其结果是我们所期望的。本篇文章主要探讨了Rust自动化测试的几种常见场景。 2.测试函数详解 在Rust项目工…

(三)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

解决:ValueError: the first two maketrans arguments must have equal length

解决&#xff1a;ValueError: the first two maketrans arguments must have equal length 文章目录 解决&#xff1a;ValueError: the first two maketrans arguments must have equal length背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在…

数据可视化:用图表和图形展示数据

写在开头 在当今信息爆炸的时代,海量的数据如同一座沉默的宝库,等待着我们挖掘和理解。然而,这些庞大的数据集本身可能令人望而生畏。在这个时候,数据可视化成为了解数据、发现模式和传达信息的强大工具。本篇博客将带领你探索数据可视化的奇妙世界,学习如何在python中使…

win10 tensorrt源码编译onnx

直接利用官方源码&#xff0c;如下图&#xff0c;trtexec源码在TensorRT安装目录下&#xff0c;双击trtexec.sln文件&#xff0c;使用vs2019打开源码工程。 如下图&#xff0c;以yolov8为例子&#xff0c;编译成功项目之后&#xff0c;设置命令行参数&#xff1a; --onnxd:/yo…

程序员养生之道

程序员养生之道——如何保持健康的生活方式 摘要&#xff1a; 随着互联网行业的快速发展&#xff0c;越来越多的人选择从事程序员这个职业。然而&#xff0c;长时间的工作和高强度的压力容易导致程序员出现亚健康状况&#xff0c;如头发稀疏、视力下降、肥胖等问题。因此&#…

【Lustre相关】功能实践-01-Lustre集群部署配置

文章目录 一、前言1、关于io5002、关于HPC3、软件架构4、部署方式 二、软件安装1、配置yum源2、内核安装2、服务端安装3、客户端安装4、zfs安装 三、集群部署1、关闭防火墙及SELinux2、配置网络2.1、通用格式2.2、参考示例 3、配置zfs&#xff08;可选&#xff09;3.1、通用格式…