Java异常体系总结(上篇)

目录

1. 什么是异常?

2. 异常家族体系介绍

2.1 Error

2.2 Exception

2.2.1 运行时异常

2.2.2 编译时异常

2.2.3 Exception 分类总结

3. 从类加载的全过程深入理解编译时异常与运行时异常

3.1 类加载的全过程

3.2 什么是编译时异常?

3.3 什么是运行时异常?

3.4 Java问什么要分为编译时异常与运行时异常

4. 编译时异常代码展示

4.1 日期格式转换异常

 4.2 IO流文件找不到异常

5. 运行时异常代码展示

5.1 除0异常

5.2 数组越界异常

6. 小结


1. 什么是异常?

异常其实就是代表程序出现的问题。

我们都知道,在编写代码时,我们时常会编写出一些 bug,那么这些 bug,它们有一些可能是异常,有一些可能不是异常。

这里有一个误区需要各位注意,学习异常不是为了让我们以后在写代码的过程中不出现异常,但其实也很难避免不出现异常,学习异常是为了让我们知道在程序出现异常之后,该怎么去处理它。

2. 异常家族体系介绍

我们知道,在Java中,有各种各样的异常,它们其实是一个大的家族,而这个家族的首领就是 java.lung.Throwable。

而 Throwable 又分为俩大家族,一个是Error(错误),一个是Exception(异常)。

如下图中关系所示

2.1 Error

Error 通常代表系统级别错误,属于严重问题;系统一旦出现问题,sun公司会把这些错误封装成 Error 对象;Error 是sun 公司自己用的,不是给我们程序员用的,因此对于我们开发人员来讲,不需要特别关注。

2.2 Exception

Exception 叫做异常,代表程序中可能出现的问题,是异常体系中的最顶层父类,我们通常会用Exception以及它的子类来封装程序出现的问题。异常里边又简单可以分为运行时异常与编译时异常。

2.2.1 运行时异常

RuntimeException 及其子类,编译阶段不会出现异常提醒。是在程序运行的时侯才会出现的异常,一般是由于参数传递出现的异常(如:数组索引越界异常)。

2.2.2 编译时异常

编译时异常没有继承 RuntimeException ,直接继承了 Exception ,在我们编写代码时就会出现的异常,在编写代码时必须手动处理解决,作用在于提醒程序员,通常情况下IDEA编辑器会给出我们相应的的异常处理提示,我们可以采取对应的方案去解决(如:日期解析异常)。

2.2.3 Exception 分类总结

对于我们程序员来说,需要着重掌握 Exception 这一家族体系中的各成员

3. 从类加载的全过程深入理解编译时异常与运行时异常

3.1 类加载的全过程

我们都知道,一个Java类,从编写到运行是需要经历一个过程的,如下图所示,我们编写一个 Java 代码文件,想要运行它并得到结果是需要以下的一个过程的。

首先(1)我们编写Java文件;

其次(2)编译阶段,编写完成之后,执行 Javac 命令,将编写的 Java 文件编译成字节码文件;

再次(3)运行阶段,运行我们编译完成得到的字节码文件;

最终(4)程序运行完毕,输出结果。

3.2 什么是编译时异常?

通过我对上面类加载的过程叙述,想必大家此时对编译时一场应该有一个模糊的了解到了吧,我们知道,在编写代码时,我们编写的其实是 Java 文件,在编译完成之后,我们会通过javac命令使 Java 文件编译成字节码文件,如下图所示,在编译阶段,我们的系统会检查你所编写的代码有没有语法层面的错误,但是不会检查你的代码有没有逻辑层面的错误这样说各位应该明白了吧,因为此时我们写的代码还没有运行呢,就所有逻辑错误,系统在没有运行之前也是件查不到的!!!

此外,我们的 javac命令在编写为字节码文件时,不仅会做语法检查,还会对我们的代码做一个优化处理。

例如我在写代码时定义一个字符串 String str = "a" + "b" + "c";javac 在编写为字节码文件的时候,会自动将 str 做优化,实际编写为字节码文件之后是 String str = "abc";

还有就是泛型,我们所写的泛型其实在 Java 中属于伪泛型,它只有在编写代码时我们可以看得到,在javac编译成字节码文件之后,泛型就消失不见了,我们想一想,你在给一个List容器添加了泛型之后,假设你添加的泛型为<Integer>,若你再添加 String 类型的数据,各位想想,是不是会报错,这种通过泛型约束添加数据类型也属于编译时异常,需要在代码编写阶段就提前处理好的。

3.3 什么是运行时异常?

刚才我们详细的了解了什么是编译时异常,也那么现在我们再来看运行时异常,可以说是非常简单了吧!

编译时异常,是对我们代码语法层面的检查,运行时异常,就是我们程序运行之后才出现的逻辑异常,执行编译完成得到的字节码文件,再运行得出结果,如果在编译时检查除了一部分语法异常,那么逻辑异常就会在运行阶段给我们展示出来。

3.4 Java问什么要分为编译时异常与运行时异常

不知道各位有没有想过,Java问什么要分为编译时异常与运行时异常?直接把他们归为一类不好吗?

其实通过上方的讲解,各位应该也知道一个大概了,因为在编译阶段,我们的代码还尚未运行,即便是有逻辑错误,但程序在运行之前也无法检查出来,这个阶段,其实更多的是在提醒我们程序员检查本地语法是否有误。而且,在编译阶段,不仅是在检查语法是否有误,同时也做了代码优化这一步骤,将一些错误和对程序性能的优化提前到了程序运行之前,提高了程序的执行效率,同时也减少了出错率。

而运行时异常只有程序运行之后我们才能知道,它的真正原因就是因为代码出错而导致的异常,与语法无关;如果发生这种异常,我们就可以根据它的提示归根究源,迅速找到问题所在,从而解决程序出现的问题,在某方面也提高了程序的健壮性。

下面我简单给各位列举几个异常,各位就会对异常有更加深入的理解了。

4. 编译时异常代码展示

4.1 日期格式转换异常

我编写了一段代码,做了一个字符串日期格式转换的操作

public class TestException {
    public static void main(String[] args) {

        // 演示编译时异常
        // 定义一个日期字符串
        String time = "2023年8月3日";

        // 创建一个 SimpleFormatter 的对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

        // 传入 time 字符串转化
        Data data = sdf.parse(time);

        // 输出 data
        System.out.println(data);


    }
}

但在IDEA编辑器中,它提醒我在进行 parse 操作时,可能会出现异常,我们按键盘上的 alt + Enter 键,IDEA就可以给出我们相应的解决方案,这种异常就属于编译时异常,是可以在编写代码时解决的异常

 4.2 IO流文件找不到异常

定义一个 FileInputStream 的对象,但这里它却报了一个异常,我们鼠标点过去 Alt + Enter,它会让我们对异常做处理。

那么这里会有什么异常发生呢?我们的代码明明写的没有错为啥什么会出现异常呢?

这种异常就属于是编译时异常,一般情况下我们本身编写没有问题,而是语法检查时可能会出现的问题,像上面的IO流,我们本身创建对象没有问题,但是程序不知道你填写的路径是否有这个文件的存在,因此才会爆出异常。

5. 运行时异常代码展示

5.1 除0异常

如下代码,我们定义一个变量a = 10,一个变量b = 0,让变量 c = a/b,再打印出c的值。

其实我们可以看出,每一行代码在语法层面都没有问题,但是0不能作为除数着我们是知道的,因此在编译阶段,这种错误不会被提示出来,只有在代码运行之后陈程序才知道有这样一段逻辑运算,这种异常就属于运行时异常。

5.2 数组越界异常

如下所示,我定义一个 int 数组,长度为3,但我却给它赋四个值,它就会在运行的时候爆出数组越界异常(ArrayIndexOutOfBoundsException)。

可以看到,我们的每一行代码在语法层面上其实都没有错误吧,只是一个简单的赋值操作,但是,我们的程序在运行之前根本就不知道数组没有第四个位置,只有才运行之后,数组出现在内存时它才知道,也就是说必须在运行时才能检验出来的异常就是运行时异常。

6. 小结

本篇主要说明 Java 中的异常体系,以及我们重点要掌握的两种异常;

下篇我会重点讲解这些异常该如何处理,异常处理时需要注意的细节,以及面试时会问到那些关于异常的问题,因为内容过多,因此拆分成上下两篇。

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

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

相关文章

OpenCV中图像变换

一、介绍 transform()&#xff1a;Transposes a matrix. perspectiveTransform()&#xff1a;Performs the perspective matrix transformation of vectors. warpAffine()&#xff1a;Applies an affine transformation to an image. warpPerspective()&#xff1a;Applies a p…

振弦传感器信号转换器应用山体滑坡安全监测

振弦传感器信号转换器应用山体滑坡安全监测 随着人类文明的进步&#xff0c;自然灾害对人们的生活和财产安全造成的威胁也越来越大。山体滑坡作为自然灾害中的一种&#xff0c;给人们的生活和财产安全带来了极大的威胁。因此&#xff0c;进行山体滑坡的安全监测显得尤为重要。振…

标准IO和直接IO

标准IO访问方式 直接IO访问方式&#xff08;open O_DIRECT绕过内核缓冲区直接访问&#xff0c;有效避免CPU和内存多余时间的开销) 注意:直接I/0的缺点就是如果访问的数据不在应用程序缓存中&#xff0c;那么每次数据都会直接从磁盘进行加载&#xff0c;这种直接加载会非常缓慢…

Kubespray-offline v2.21.0-1 下载 Kubespray v2.22.1 离线部署 kubernetes v1.25.6

文章目录 1. 目标2. 预备条件3. vcenter 创建虚拟机4. 系统初始化4.1 配置网卡4.2 配置主机名4.3 内核参数 5. 打快照6. 安装 git7. 配置科学8. 安装 docker9. 下载介质9.1 下载安装 docker 介质9.2 下载 kubespray-offline-ansible 介质9.3 下载 kubernetes 介质 10. 搬运介质…

Selenium入门详细教程+实例演示

目录 1.Selenium概述 1.1什么是Selenium 1.2Selenium的优势 1.3Selenium WebDriver原理 2.Selenium环境搭建 3.Selenium 简单示例 4.八大元素定位 4.1定位方式 4.2定位方式的用法 5.Selenium API 5.1WebDriver 常用 API 5.2WebElement 常用 API 5.3代码示例 6.元素等待机…

DNSlog注入(利用DNSlog平台将SQL盲注变成回显注入)

前言什么是UNC什么是DNSlog注入DNSlog注入的条件防止DNSlog注入的几个措施 sqli-labs试验 前言 前几天面试的时候&#xff0c;面试官问我知不知道OOB&#xff08;带外数据&#xff09;。 当时我蒙了&#xff0c;确实没听说过这个东西&#xff0c;然后面试官告诉我原来dnslog注入…

Vue3 第一节 Vue3简介以及创建Vue3工程

1.Vue3简介以及Vue3带来了什么 2.创建Vue3.0工程并分析Vue3工程结构 3.setup函数 4.ref函数 5.reactive函数 一.Vue3简介以及Vue3带来了什么 ① Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff0…

[腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统

[腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统 ⭐前言&#x1f31c;Cloud Studio产品介绍1.登录2.创建工作空间3.工作空间界面简介4.环境的使用 ⭐实验实操&#x1f31c;Cloud Studio实现图书管理系统1.实验目的 2. 实验过程2.实验环境3.源码讲解3.1添加数据…

postgresql 使用之 存储架构 触摸真实数据的存储结构以及组织形式,存入数据库的数据原来在这里

存储架构 ​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 postgresql 数据库服务运行时&#xff0c;数据在磁…

【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

IMX6ULL一共有两个ADC&#xff0c;每个ADC都有八个通道&#xff0c;但他们共用一个ADC控制器 1.设备树 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 adc1: adc02198000 {compatible "fsl,imx6ul-adc", "fsl,vf610-adc";reg <0x0219…

Jenkins工具系列 —— 插件 钉钉发送消息

文章目录 安装插件 Ding TalkJenkins 配置钉钉机器人钉钉APP配置项目中启动钉钉通知功能 安装插件 Ding Talk 点击 左侧的 Manage Jenkins —> Plugins ——> 左侧的 Available plugins Jenkins 配置钉钉机器人 点击 左侧的 Manage Jenkins &#xff0c;拉到最后 钉…

【Segment Anything Model】四:预处理自己的数据集接入SAM

文章目录 1️⃣预备知识2️⃣实现思路&#x1f538;脚本预处理得到包含embedd和GT的npz&#x1f538;编写Dataset类3️⃣代码&#x1f538;实现脚本预处理得到包含embedd和GT的npz代码&#x1f538;实现Dataset的代码 1️⃣预备知识 欢迎订阅本专栏&#xff08;为爱发电&#…

基于SPSSPRO实现层次分析法(AHP)

层次分析法&#xff0c;简称AHP&#xff0c;是指将与决策总是有关的元素分解成目标、准则、方案等层次&#xff0c;在此基础之上进行定性和定量分析的决策方法。&#xff08;摘自百度百科&#xff09; 层次分析法有着广泛使用&#xff0c;涉及到的平台也多种多样&#xff0c;今…

Android Studio新版本logcat过滤说明

按包名过滤 //输入package:&#xff08;输入一个p就会有提示的&#xff09; &#xff0c;后面加上包名 比如: package:com.xal.runcontrol package:包名可以完整或者输部分包名即可 package:包名需要输完整准确 package~:正则表达式过滤 不了解正则表达式的可以参考&#…

·[K8S:使用calico网络插件]:解决集群节点NotReady问题

文章目录 一&#xff1a;安装calico&#xff1a;1.1&#xff1a;weget安装Colico网络通信插件&#xff1a;1.2&#xff1a;修改calico.yaml网卡相关配置&#xff1a;1.2.1&#xff1a;查看本机ip 网卡相关信息&#xff1a;1.2.2&#xff1a;修改calico.yaml网卡interface相关信…

普及100Hz高刷+1ms响应 微星发布27寸显示器:仅售799元

不论办公还是游戏&#xff0c;高刷及低响应时间都很重要&#xff0c;微星现在推出了一款27寸显示器PRO MP273A&#xff0c; 售价只有799元&#xff0c;但支持100Hz高刷、1ms响应时间&#xff0c;还有FreeSync技术减少撕裂。 PRO MP273A的100Hz高刷新率是其最大的卖点之一&#…

使用node.js 搭建一个简单的HelloWorld Web项目

文档结构 config.ini #将本文件放置于natapp同级目录 程序将读取 [default] 段 #在命令行参数模式如 natapp -authtokenxxx 等相同参数将会覆盖掉此配置 #命令行参数 -config 可以指定任意config.ini文件 [default] authtokencc83c08d73357802 #对应一条隧…

Python绘制箭头向量图,并绘制三体引力场

文章目录 简介箭头设置三维场图 简介 箭头向量图十分常见&#xff0c;比如天气预报在显示风场的时候&#xff0c;就会贴心地用箭头指明风的方向。在matplotlib中&#xff0c;用quiver函数来绘制箭头向量图&#xff0c;示例如下 import matplotlib.pyplot as plt import numpy…

使用hexo进行博客迁移

本文不会从0开始介绍如何通过hexo去搭建一个github page。因为最近折腾了下&#xff0c;发现这玩意儿确实写个博客很费劲&#xff0c;打算把他拖管到github当作我的知识库网站&#xff0c;我的主要文章还是通过mweb写完一键发布到博客园&#xff0c;然后csdn记录一些杂文和思考…

PHP8的程序结构-PHP8知识详解

在做任何事情之前&#xff0c;都需要遵循一定的规则。在PHP8中&#xff0c;程序能够安照人们的意愿执行程序&#xff0c;主要依靠程序的流程控制语句。 不管多复杂的程序&#xff0c;都是由这些基本的语句组成的。语句是构造程序的基本单位。程序执行的过程就是执行程序语句的…