异常 Exception 02

news2024/11/15 9:54:49

异常 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

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

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

相关文章

佳易王物流快运物流单打印登记查询系统软件操作教程

一、前言&#xff08;编程应用实例系列&#xff09;&#xff1a; 佳易王物流快运物流单打印登记查询系统软件操作教程 软件有试用版&#xff0c;可以下载试用&#xff0c;了解软件操作和软件功能。 软件试用版下载可以点击最下方官网卡片 软件为绿色免安装版&#xff0c;下载…

2023-简单点-yolox-pytorch代码解析(二)-nets/yolo.py

yolox-pytorch&#xff1a;nets/yolo.py yolox网络结构yolox-pytorch目录今天解析注释nets/yolo.py yolox网络结构 yolox-pytorch目录 nets目录 今天解析注释nets/yolo.py import torch import torch.nn as nnfrom .darknet import BaseConv, CSPDarknet, CSPLayer, DWConv##…

各种与梅洛相关的葡萄酒知识

梅洛葡萄是可以通过其松散的大浆果串来识别的&#xff0c;与赤霞珠葡萄相比&#xff0c;这种颜色的蓝色/黑色调更少&#xff0c;皮肤更薄&#xff0c;单宁更少。与赤霞珠相比&#xff0c;梅洛葡萄的糖含量往往更高&#xff0c;苹果酸含量较低。梅洛在寒冷的土壤中茁壮成长&…

【云原生系列】Kubernetes知识点

目录 概念 基础架构 单master节点 多master节点 组件 Master节点核心组件 其他组件 请求发送流程 插件 核心资源 调度资源 Pod 创建pod组件间调用流程 pod生命周期&#xff1a; 初始化容器 镜像拉取策略 重启策略 钩子函数 探针 探针的实现方式 DownwardAP…

【Qt基础之QPalette实例电子时钟】

# 简介 借助`QLCDNumber`实现电子时钟,可以随意拖拽到桌面任意位置,鼠标右键进行关闭,用于实践`QPalette`类、`QTimer`的使用以及`mousePressEvent`\`mouseMoveEvent`\`mouseDoubleClickEvent`事件处理函数的使用。可在此基础上扩展其他应用,参看Qt帮助手册。 # QPalette …

画中画视频剪辑:批量制作画中画,提升视频制作技能

在视频制作过程中&#xff0c;画中画是一种常见的视觉效果&#xff0c;它能够使多个视频片段在同一画面中展示&#xff0c;增加信息的丰富度和视觉的吸引力。这种效果通常用于增加信息的丰富度&#xff0c;如在新闻节目中&#xff0c;同时展示主持人和采访对象的画面。画中画也…

windows下使用iperf3

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用步骤1.下载2.解压3.测试1.作为服务器使用2.作为客户端使用 总结 前言 windows使用iperf3和linux是一样的&#xff0c;而且可以相互操作。 一、使用步骤…

Java最难的语法<泛型>

时间过得很快&#xff0c;我们马上就进入了&#xff0c;Java最难语法的学习&#xff0c;加油吧&#xff01; 1.包装类 想要学好泛型就要了解包装类。 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个…

Python入门06布尔值

目录 1 什么是布尔值2 怎么生成布尔值3 在控制程序中使用布尔值4 数据过滤、排序和其他高级操作总结 1 什么是布尔值 首先我们要学习一下布尔值的定义&#xff0c;布尔值是一种数据类型&#xff0c;它只有两个可能的值&#xff1a;True&#xff08;真&#xff09;或 False&…

scikit-opt几种数值模拟退火的代码示例,和参数详解,以及基础模拟退火的原理代码示例

python基础模拟退火原理示例 模拟退火的特性决定了一般可以用于算法的调参&#xff0c;相比较遗传算法来说&#xff0c;普遍更快一些&#xff0c;但是也更容易陷入局部最优。相对来说&#xff0c;遗传算法的更新解机制是在最每一个局部最优解附近盘旋游荡&#xff0c;则更容易…

View绘制

onDraw 绘制 canvas 画布 paint 画笔 坐标系 x y x 0 y 0 则屏幕左上角 y从上往下值增加 像素转换 dp2px 画线line drawLine 圆circle drawCircle drawPath: 在onSizeChanged 时候初始化 addCircle 添加圆 CW顺时针 CCW 逆时针 CW CCW填充规则不同 填充规则: 默认 …

NX二次开发UF_MTX2_vec_multiply_t 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX2_vec_multiply_t Defined in: uf_mtx.h void UF_MTX2_vec_multiply_t(const double vec [ 2 ] , const double mtx [ 4 ] , double vec_product [ 2 ] ) overview 概述 Ret…

邮政快递物流查询,将指定某天签收的单号筛选出来

批量查询邮政快递单号的物流信息&#xff0c;将指定某天签收的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左…

python-nmap库使用教程(Nmap网络扫描器的Python接口)(功能:主机发现、端口扫描、操作系统识别等)

文章目录 Python-nmap库使用教程前置条件引入python-nmap创建Nmap扫描实例执行简单的主机发现&#xff08;nmap -sn&#xff09;示例&#xff0c;我有一台主机配置为不响应 ICMP 请求&#xff0c;但使用nmap -sn&#xff0c;仍然能够探测到设备&#xff1a; 端口扫描扫描特定端…

线性回归 调试方法

调试方法 特征缩放 对于某些不具有比较性的样本特征 x i x_i xi​ &#xff08;比如对其他的x来说 x i x_i xi​ 相当大或者相当小&#xff09;&#xff0c;梯度下降的过程可能会非常漫长&#xff0c;并且可能来回波动才能最后收敛到全局的最小值。 在这样的情况下&#xff…

SAP BW层级结构小结属性数据源+专家例程实现层级结构增强加载

作者 idan lian 如需转载备注出处 BW信息对象-层级结构 RSH1 维护信息对象层级 这里的文本描述对应T表中的描述&#xff0c;文本数据源加载之后有数据 信息对象层级H表 以上描述都是根据自我理解翻译的&#xff0c;非官方翻译 层级标识&#xff1a;自动生成&#xff0c;其实…

CCF CSP认证 历年题目自练Day50

题目 试题编号&#xff1a; 201809-3 试题名称&#xff1a; 元素选择器 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 题目分析&#xff08;个人理解&#xff09; 还是先理解题意&#xff0c;关于html的部分&#xff0c;可以按照样例画出…

2000-2021年各省人口密度数据

2000-2021年各省人口密度数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;地区、年份、年末常住总人口(万人&#xff09;、面积&#xff08;平方千米&#xff09;、人口密度&#xff08;人/平方千米&#xff09; 3、来源&#xff1a;各省年鉴、统计年鉴、各省统计局…

Redis面试题-缓存穿透,缓存击穿和缓存雪崩

目录 缓存穿透 面试官&#xff1a;什么是缓存穿透 ? 怎么解决 ? 面试官&#xff1a;你能介绍一下布隆过滤器吗&#xff1f; 缓存击穿 面试官&#xff1a;什么是缓存击穿 ? 怎么解决 ? 缓存雪崩 面试官&#xff1a;什么是缓存雪崩 ? 怎么解决 ? 缓存穿透 面试官&a…

笔记二十六、React中路由懒加载的扩展使用

26.1 在路由中配置懒加载 lazy routes/index.jsx 代码 import {Navigate} from "react-router-dom"; import Home from "../components/Home"; import About from "../components/About"; // import Classify from "../components/Home/c…