第7章-第1节-Java中的异常处理

news2024/11/14 19:13:14

1、异常Exception概述:

1)、异常的概念:

现实生活中万物在发展和变化会出现各种各样不正常的现象。

例如:人的成长过程中会生病。 实际工作中,遇到的情况不可能是非常完美的。

比如:你写的某个模块,用户输入不一定符合 你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据 库的数据,数据可能是空的等。 我们的程序再跑着,内存或硬盘可能满了等等。 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是: Exception , 意思是例外。 这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处 理,安全的退出,而不至于程序崩溃。

2)、实际开发中异常的理解:

实际开发中,异常从面向对象的角度考虑也是一类事物,我们可以向上抽取为异常类。这个异常类可以对一些不正常的现象进行描述,并封装为对象。

2、异常体系:

JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是 派生于 Throwable 类的一个实例。 如果内置的异常类不能够满足需要,还可以创建自己的异 常类。 Thorwable 类(表示可抛出)是所有异常和错误的超类,两个直接子类为 Error ( 错误)和 Exception ( 异常)。

先来看看 java 中异常的体系结构图解:

1)、Error类:

 Error是 java 所有错误类的父类,描述了 java 运行时系统内部错误和资源耗尽错误。这 类错误是我们无法控制的,同时也是非常罕见的错误,表明系统 JVM 已经处于不可恢复的崩 溃状态中,它是由 JVM 产生和抛出的,比如 OutOfMemoryError 、 ThreadDeath 等。 所以错误是很难处理的,一般与硬件及运行实际环境有关,一般来说程序员是无法处理这些错 误的,我们在编程中,可以不去处理这类错误 例如内存溢出,需要的内存超出了 java 虚拟机管理的内存范围

//递归模拟内存溢出
public class Test01 {
    public static void main(String[] args) {
        A(0);
    }
}
    
public static void A(int num){
    num += 1;
    A(num);
}

Error与Exception的区别:

Error错误,就好像我们开车去上班,结果半路车坏了,那么这种问题我们是没办法提前预知道的
Exception 就好像,我们开车去上班,我们广播中已经提示了A路线堵车,那么我们就可以换条路线即可。

2)、Exception类:

Exception 类所有异常类的父类,其子类对应了各种各样可能出现的异常事件。 Error 是程序无法处理的错误,但是 Exception 是程序本身可以处理的异常,在程序中应当尽可能去处理这些异常。

3)、运行时异常RuntimeException:

RuntimeException 和 他 的 所 有 子 类 异 常,都 属 于 运 行 时 期 异 常 。

例如: NullPointerException 、 ClassCastException 、 IndexOutOfBoundsException 、 ArithmeticException 等。 因为程序编译时异常不能被检查出,所以又称为 不检查异常 ( UnCheckedException ) 。 运行时异常一般是由程序逻辑错误引起的,所以在编写程序时,我们应该从逻辑角度尽可能避 免这类异常的发生。 当出现 RuntimeException 的时候,系统将自动检测并将它们交给缺省的异常处理程序(虚 拟 机 接 管 并 处 理 ) , 用 户 可 以 不 必 对 其 处 理 。

比 如 : 我 们 从 来 没 有 人 去 处 理 过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 ArithmeticException 异常,异常算术条件时抛出。 例如: “ 除以零 ” 的整数会抛出此类的一 个实例。

//空指针异常
public class Test01 {
    public static void main(String[] args) {
        int [] nums = null;
        System.out.println(nums.length);
    }
}

4)、编译时异常:

要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常

public class BianYiDemo {
    public static void main(String[] args) throws ParseException {
        String str = "2022-07-09";
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = format.parse(str);

        System.out.println(date);
    }
}

3、异常处理

1)、throws抛出异常:

public static void main(String[] args)throws ParseException{
    B(); //此处爆出红线
}

public static void B() throws ParseException{
    Date parse = new SimpleDateFormat("yyyy-MM-dd").parse("2024-01-05 00:00:00");
    System.out.println(parse);
}

throws 关键字表示,抛出异常,跟在方法后,后可跟多个异常,当前虽然可以抛出不处理,抛出异常的方法被调用处,还是要处理!

【注意】

throws虽然抛出异常,当前代码块中的红线消失可以运行,但是如果代码逻辑或者数据错误,还是会爆出异常,这是因为,throws是负责将异常向上抛出,谁调用此方法谁就负责处理这个异常,那么此处的main方法将异常继续向上抛出,那么main方法是JVM调用的,所以就相当于异常抛给了JVM,然而JVM没有处理这个异常,所以异常信息还是会打印出来!

2)、try-catch捕获异常:

public static void main(String[] args) {
    try {   // try块可能为出现异常的代码段
        B();
    } catch (ParseException e) {  // catch 块为捕获异常(要捕获的异常类型)
        //处理异常的方式
        System.err.println("您的时间格式错误!请修正!!");
    }
}
    
public static void B() throws ParseException {
    Date parse = new SimpleDateFormat("yyyy-MM-dd").parse("2024=01-05 00:00:00");
    System.out.println(parse);
}

try块表示发生异常的代码;

catch表示捕获异常,随后打印异常信息,也可以继续向上抛出!

3)、try-catch-finally:

try catch 后还可接finally块,而finally块中代码无论异常是否发生,都会执行!!常用于关闭资源等操作!

public static void main(String[] args) {
    try {
        C();
    } catch (ArithmeticException e) {
        System.err.println("分母为0了!!!!快去检查!!!!!");
    }finally {
        //常常用于关闭关键资源
        System.out.println("我是 finally 数据块!,如果出现异常,那就让我关闭数据库资源!");
    }
}

//定义一个方法  模拟分母为0的异常情况
public static void C() throws ArithmeticException {
    int num1 = 10;
    int num2 = 0;
    System.out.println("我正常打开了数据库资源!!!!");
    System.out.println(num1/num2);
    System.out.println("我正常关闭数据库资源!!!!");
}

【思考】

        1.如果 异常没有抓住 或者 没有出现异常 的情况下,finally 还会执行嘛? 都会执行

        2.如果 遇见return 关键字,那么finally 还会执行嘛? finally 不会收到return影响的!

【finally块不会被执行的情况】有4种特殊情况,finally块不会被执行:

        1.finally语句块中发生了异常 (中断了)

        2.前面的代码中执行了System.exit()退出程序

        3.程序中所在的线程死亡

        4.关闭CPU

 4)、try-finally:

不去处理异常,但是finally还是会执行

try {
    C();
} finally {
    //常常用于关闭关键资源
    System.out.println("我是 finally 数据块!我关闭数据库资源!");
}
//....

5)、getMessage和e.PrintStackTrace区别:

try {
    C();
} catch (ArithmeticException e) {
    System.err.println("分母为0了!!!!快去检查!!!!!");
    //System.out.println(e.getMessage());
    e.printStackTrace();
} finally {
    //常常用于关闭关键资源
    System.out.println("我是 finally 数据块!我关闭数据库资源!");
}
//.....

getMessage:获取异常简单的描述信息。

语法格式:String msg = exception.getMessage();

PrintStackTrace:打印异常追踪的堆栈信息,比较适合于程序的调试阶段

语法格式:exception.printStackTrace();

6)、throw关键字:

throw关键字为手动抛出异常

通过自己判断出现异常的地方,来手动throw抛出异常,因为是运行时异常,在调用处可以不去处理.

在后面的学习中,我们会慢慢发现,throw通常会提供一种方法的多样性,常常搭配if结构一起使用!

public static void main(String[] args) {
    try {
            C();
    } catch (Exception e) {
            System.out.println("分母为0!!!");
    }
}
    
//定义一个方法  模拟分母为0的异常情况
public static void C() {
    int num1 = 10;
    int num2 = 2;
    if(num2==0){
        throw new ArithmeticException("我是throw关键字 --->   分母为0啦!");
    } else {
        System.out.println(num1/num2);
    }
}

7)、throw和throws:

不同点:

  1. 位置不同。throws用在方法上,后边跟的是异常类,可以跟多个异常类。throw用在方法内,后面跟的是异常对象

  2. 功能不同。

    1. throws用来声明异常,让调用者只知道该功能可能出现的问题,throws表示出现异常的一种可能性,并不一定会发生这些异常

    2. throw抛出具体的问题对象。执行throw则一定抛出了某种异常对象

 相同点:两者都是消极处理异常的方式

4、自定义异常:

1)、定义:继承Throwable或者他的子类Exception的用户自己定义的异常类。前面的内容提到的都是系统有的异常类。

2)、在程序中使用自定义异常的步骤:

  • 创建自定义异常类

  • 编写异常信息

  • 通过throw关键字使用自定义异常类

例如:

class AgeException extends Exception {
    public AgeException(String message) {
        super(message);
    }
}

public class Test03 {

    //用户输入年龄方法
    public static void input() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入姓名:");
        String name = scanner.next();//接收键盘上姓名的输入
        System.out.println("请输入年龄:");

        while (scanner.hasNext()) {
            //Scanner类中的hasNext()方法可以判断下一个输入是否为整数,整数才会进入到循环体,该程序利用这个特点并且结合if判断语句来控制年龄的输入是否<0
            try {
                int age = scanner.nextInt();//接收键盘上年龄的输入
                if (age < 0) {
                    throw new AgeException("年龄不能为负数");//2、一旦出现年龄输入为< 0的情况,就会通过throw抛出一个AgeException类的对象并且捕获处理
                }
                System.out.println("姓名" + name);
                System.out.println("年龄" + age);
                break;

            } catch (AgeException e) {
                System.out.println(e.getMessage() + "请重新输入:");
            }
        }
    }

    public static void main(String[] args) {
        input();
    }
}

5、final、finally、finalize的区别:

  • final用于声明属性,方法和类,分别表示属性不可交变,方法不可被重写,类不可继承。

  • finally是异常处理语句结构的一部分,表示总是执行。

  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。

本电子书目录:

《Java基础的重点知识点全集》 

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

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

相关文章

【算法系列 | 12】深入解析查找算法之—斐波那契查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第12讲&#xff0c;讲…

spring模块(二)IOC容器之BeanFactory

在Spring中实现控制反转的是IoC容器 &#xff08;1&#xff09;IoC 不是一种技术&#xff0c;只是一种思想&#xff0c;一个重要的面向对象编程的法则&#xff0c;它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象&#xff0c;从…

AI与5G、IDC等成为数字经济的重要基础设施

AI与5G、IDC等已经成为数字经济的重要基础设施&#xff0c;它们的影响和作用不容忽视。随着技术的迅速发展&#xff0c;AI在各行各业都得到了广泛应用&#xff0c;并成为数字经济的核心驱动力之一。 首先&#xff0c;AI的兴起为数字经济带来了巨大的机遇。AI技术可以帮助企业从…

项目实战:数字孪生可视化大屏幕,实现生产过程实时监控

项目介绍 智慧工厂数据可视化系统&#xff0c;融合工业大数据、物联网、人工智能等各类信息技术&#xff0c;整合厂区现有信息系统的数据资源&#xff0c;实现数字孪生工厂、设备运维监测、智能管网监测、综合安防监测、便捷通行监测、能效管理监测、生产管理监测、仓储物流监…

Unity添加所有场景到BuildSettings

Unity添加所有场景到BuildSettings using UnityEngine; using UnityEditor; using System.Collections.Generic; using System.IO; public class Tools : Editor {[MenuItem("Tools/添加所有场景到BuildSettings")]static void CheckSceneSetting(){List<string&…

【Linux Shell】6. echo 命令

文章目录 【 1. 显示普通字符串 】【 2. 显示转义字符 】【 3. 显示变量 】【 4. 显示换行 】【 5. 显示不换行 】【 6. 显示命令执行结果 】 Shell 的 echo 指令用于字符串的输出。命令格式&#xff1a; echo string【 1. 显示普通字符串 】 #!/bin/bashecho "It is a …

【STM32】STM32学习笔记-ADC模数转换器(21)

00. 目录 文章目录 00. 目录01. ADC简介02. ADC主要特征03. 逐次逼近型ADC04. ADC功能描述05. ADC基本结构06. 输入通道07. 转换模式08. 触发控制09. 数据对齐10. 转换时间11. 校准12. 硬件电路13. 附录 01. ADC简介 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F1…

2023 hnust 湖南科技大学 大四上 计算机图形图像技术 课程 期末考试 复习资料

计算机图形图像技术复习资料 前言 改编自&#xff1a;https://blog.csdn.net/Liu_Xin233/article/details/135232531★重点&#xff0c;※补充github 考试题型 简述题&#xff08;10分4题&#xff0c;共40分&#xff09; 第1章的基本内容三维观察流水线中的基本概念与理解三…

Linux第19步_安装“Ubutun交叉编译工具链”

由于Ubuntu系统使用的GCC编译器&#xff0c;编译结果是X86文件&#xff0c;只能在X86上运行&#xff0c;不能在ARM上直接运行。因此&#xff0c;还要安装一个“Ubutun交叉编译工具链”&#xff0c;才可以在ARM上运行。 arm-none-linux-gnueabi-gcc是 Codesourcery 公司&#x…

计算机组成原理 指令流水线

文章目录 指令流水线指令流水线的概念流水线性能分析流水线的吞吐率流水线的加速比流水线的效率 影响流水线的因素结构相关 (资源冲突)数据相关 (数据冲突)控制相关 (控制冲突) 流水线分类超量流水线 指令流水线 #mermaid-svg-vSsJnNqZf24LgjVK {font-family:"trebuchet m…

Ubuntu20.04安装ROS2 Foxy

Ubuntu20.04安装ROS2 Foxy 实操安装 安装ROS2的教程在网上很多&#xff0c;但是我操作之后都有问题&#xff0c;大部分的问题是在 sudo apt update 时访问packages.ros.org无法成功&#xff0c;主要的原因是没有外网&#xff0c;而自己整一个外网代理又非常麻烦&#xff0c;所…

即插即用篇 | YOLOv8 Gradio 前端展示页面 | 支持 【分类】【检测】【分割】【关键点】 任务

分类任务效果 分割任务效果 检测任务效果 关键点任务效果 使用方法 Gradio 是一个开源库,旨在为机器学习模型提供快速且易于使用的网页界面。它允许开发者和研究人员轻松地为他们的模型创建交互式的演示,使得无论技术背景如何的人都可以方便地试用和理解这些模型。使用Gradi…

二叉搜索树/二叉排序树(代码实现)(c++)

BSTree 二叉排序树概念代码部分 BSTree框架查找操作插入操作删除操作**默认成员函数完整代码 BSTree性能分析 二叉排序树概念 二叉搜索树又称二叉排序树&#xff08;BSTree, Binary Search Tree&#xff09;&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉…

IP代理测试:关于Ping测试你需要知道的一切干货

您在访问互联网时是否遇到过持续滞后或花费很长时间等待网站加载的情况&#xff1f;为了避免这种情况&#xff0c;您可以测试 ping 以查看连接速度。如果您使用代理&#xff0c;此 ping 测试还会显示代理服务器的响应速度。 ping 测试是一个很有价值的工具&#xff0c;可以帮助…

武汉灰京文化:技术先锋辐射游戏行业,带来全新体验乐趣无穷!

科技的持续演进&#xff0c;给游戏产业打了强心剂&#xff0c;让这个领域变得前所未有的越来越好玩儿。今天我们将深入探讨如何利用虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术&#xff0c;让你玩得开心&#xff0c;玩得尽兴。 想象一下&…

目标检测 | YOLOv5 训练自标注数据集实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要了解 YOLOv5 训练自标注数据集&#xff08;自行车和摩托车两种图像&#xff09;进行目标检测&#xff0c;实现迁移学习。YOLOv5 是一个非常流行的图像识别框架&#xff0c;这里介绍一下使用 YOLOv5 给使用 Labelme 标注…

【DevOps-07-2】Sonarqube基本使用

一、简要说明 Sonar Qube的使用方式很多&#xff0c;Maven可以整合&#xff0c;也可以采用sonar-scanner的方式&#xff0c;再查看Sonar Qube的检测效果 Sonarqube集成在Maven实现代码检测使用sonar-scanner客户端的方式 二、Sonarqube管理后台安装中文插件 1、登录Sonarqube管…

Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models

ABSTRACT 现代大规模视觉-语言模型&#xff08;LVLMs&#xff09;采用了相同的视觉词汇-CLIP&#xff0c;可以涵盖大多数常见的视觉任务。然而&#xff0c;对于一些需要密集和细粒度视觉感知的特殊视觉任务&#xff0c;例如文档级OCR或图表理解&#xff0c;尤其是在非英语环境…

用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

最近 ChatGPT 对 Plus 用户逐步开放一些多模态的功能&#xff0c;包括 &#xff08;图像生成&#xff09;、 GPT-4V&#xff08;图像识别&#xff09;等&#xff0c;很多网友乐此不疲地对这些新功能进行试用&#xff0c; 目前已经解锁了不少有趣的玩法&#xff0c;我将这些好玩…

软件测试/测试开发丨Vuetify框架的使用

介绍 Vuetify 是一个基于 Vue.js 精心打造 UI 组件库&#xff0c;整套 UI 设计为 Material 风格。能够让没有任何设计技能的开发者创造出时尚的 Material 风格界面。 为什么要使用Vuetify框架 所有组件遵从 Material Design 设计规范&#xff0c;UI 体验非常优秀&#xff0c…