百无聊赖之JavaEE从入门到放弃(十四)异常

目录

一.异常机制

二.异常分类

三.异常的处理方式

1.捕获异常(try-catch-finally)

2.声明异常(throws 子句)

四.try-with-resource

五.自定义异常

六.IDEA 调试 debug


一.异常机制

工作中,程序遇到的情况不可能完美。比如:程序要打开某个文件,这个文件可能不存
在或者文件格式不对;程序在运行着,但是内存或硬盘可能满了等等。
软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是:
Exception,意思是例外。遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理
的处理,安全的退出,而不至于程序崩溃呢?

异常机制本质
当程序出现异常,程序安全的退出、处理完后继续执行的机制。
异常(Exception)的概念
异常指程序运行过程中出现的非正常现象,例如除数为零、需要处理的文件不存在、数
组下标越界等。
在 Java 的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类。异常
类定义中包含了该类异常的信息和对异常进行处理的方法。

Java 是采用面向对象的方式来处理异常的。处理过程:
  1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给 JRE。
  2. 捕获异常:JRE 得到该异常后,寻找相应的代码来处理该异常。JRE 在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。

二.异常分类

Java 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对
象都是派生于 Throwable 类的一个实例。如果内置的异常类不能够满足需要,还可以创建
自己的异常类。
Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类
java.lang.Throwable ,Throwable 下面又派生了两个子类:Error 和 Exception。Java
异常类的层次结构如图所示:

 

Error
Error 是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编
写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java 虚
拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,
将出现 OutOfMemoryError。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
Error 表明系统 JVM 已经处于不可恢复的崩溃状态中。
Error 与 Exception 的区别
  • 我开着车走在路上,一头猪冲在路中间,我刹车。这叫一个异常。
  • 我开着车在路上,发动机坏了,我停车,这叫错误。系统处于不可恢复的崩溃状态。发 动机什么时候坏?我们普通司机能管吗?不能。发动机什么时候坏是汽车厂发动机制 造商的事。
Exception
Exception 是程序本身能够处理的异常。
Exception 类是所有异常类的父类,其子类对应了各种各样可能出现的异常事件。 通常 Java 的异常可分为:
1. RuntimeException 运行时异常
2. CheckedException 已检查异常

 

RuntimeException 运行时异常
派生于 RuntimeException 的异常,如被 0 除、数组下标越界、空指针等,其产生比
较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由
系统自动检测并将它们交给缺省的异常处理程序。
编译器不处理 RuntimeException, 程序员需要增加“逻辑处理 (如if判断语句) 来避免这些异常”。

 CheckedException 已检查异常

CheckedException 异常在编译时就必须处理,否则无法通过编译。

CheckedException 异常的处理方式有两种:
1. 使用“try/catch”捕获异常
2. 使用“throws”声明异常。

三.异常的处理方式

1.捕获异常(try-catch-finally)

try:
try 语句指定了一段代码,该段代码就是异常捕获并处理的范围。在执行过程中,当任意一条语句产生异常时,就会跳过该条语句中后面的代码。代码中可能会产生并抛出一种或 几种类型的异常对象,它后面的 catch 语句要分别对这些异常做相应的处理。
一个 try 语句必须带有至少一个 catch 语句块或一个 finally 语句块。
注意事项
当异常处理的代码执行结束以后,不会回到 try 语句去执行尚未执行的代码。
catch:
每个 try 语句块可以伴随一个或多个 catch 语句,用于处理可能产生的不同类 型的异常对象。 
catch 捕获异常时的捕获顺序:
如果异常类之间有继承关系,先捕获子类异常再捕获父类异常。
finally:
不管是否发生了异常,都必须要执行。
通常在 finally 中关闭已打开的资源,比如:关闭文件流、释放数据库连接等。
try-catch-finally 语句块的执行过程详细分析:
程序首先执行可能发生异常的 try 语句块。如果 try 语句没有出现异常则执行完后跳至
finally 语句块执行;如果 try 语句出现异常,则中断执行并根据发生的异常类型跳至相应的
catch 语句块执行处理。catch 语句块可以有多个,分别捕获不同类型的异常。catch 语句
块执行完后程序会继续执行 finally 语句块。finally 语句是可选的,如果有的话,则不管是
否发生异常,finally 语句都会被执行。

 

常用开发环境中,自动增加 try-catch 代码块的快捷键:
1. 将需要处理异常的代码选中。
2. IDEA 中,使用:ctrl+alt+t
3. eclipse 中,使用:ctrl+shift+z

2.声明异常(throws 子句)

1. CheckedException 产生时,不一定立刻处理它,可以把异常 throws,由调用者处理。
2. 一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常。

 

【示例】异常处理的典型代码(声明异常抛出 throws)
 

注意事项
方法重写中声明异常原则:子类重写父类方法时,如果父类方法有声明异常,那么子类
声明的异常范围不能超过父类声明的范围。

四.try-with-resource

JAVA 中,JVM 的垃圾回收机制可以对内部资源实现自动回收,给开发者带来了极大的便利。但是 JVM 对外部资源(调用了底层操作系统的资源)的引用却 无法自动回收,例如数据库连接,网络连接以及输入输出 IO 流等。这些连接就 需要我们手动去关闭,不然会导致外部资源泄露,连接池溢出以及文件被异常占 用等。
JDK7 之 后 , 新 增 了 “ try-with-resource”。 它 可 以 自 动 关 闭 实 现 了AutoClosable 接口的类,实现类需要实现 close()方法。”try-with-resources 声明”,将 try-catch-finally 简化为 try-catch,这其实是一种语法糖,在编译 时仍然会进行转化为 try-catch-finally 语句。 

五.自定义异常

  • 在程序中,可能会遇到 JDK 提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。
  • 自定义异常类只需从 Exception 类或者它的子类派生一个子类即可。
  • 自定义异常类如果继承 Exception 类,则为 CheckedException 异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException 类。
  • 习惯上,自定义异常类应该包含 2 个构造器:一个是默认的构造器,另一个是带有
    详细信息的构造器。

 【示例】自定义异常类

【示例】自定义异常类的使用
输出:
使用异常机制的建议
  • 要避免使用异常处理代替错误处理,这样会降低程序的清晰性,并且效率低下。
  • 处理异常不可以代替简单测试---只在异常情况下使用异常机制。
  • 不要进行小粒度的异常处理---应该将整个任务包装在一个 try 语句块中。
  • 异常往往在高层处理。

六.IDEA 调试 debug

调试的核心是断点。程序执行到断点时,暂时挂起,停止执行。就像看视频按下停止一样,
我们可以详细的观看停止处的每一个细节。
断点 breakpoint
程序运行到此处,暂时挂起,停止执行。我们可以详细在此时观察程序的运行情况,方便做出进一步的判断。
1. 设置断点:
(1) 在代码行号后面单击即可增加断点

 (2) 在断点上再单击即可取消断点

进入调试视图
我们通过如下三种方式都可以进入调试视图:
(1) 单击工具栏上的debug按钮:
(2) 右键单击编辑区,点击:debug
进入调试视图后,布局如下:

 

左侧为“浏览帧”:
调试器列出断点处,当前线程正在运行的方法,每个方法对应一个“栈帧”。最上面的
是当前断点所处的方法。
变量值观察区:
调试器列出了断点处所在方法相关的变量值。我们可以通过它,查看变量的值的变化。

 调试操作区

 我们通过上图中的按钮进行调试操作,它们的含义如下:

 

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

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

相关文章

Zabbix数据库分离与邮件报警

基础环境:要有zabbix服务端与被监控端实验目标:源数据库与服务端存放在一台服务器上,分离后源数据库单独在一台服务器上,zabbix服务端上不再有数据库。环境拓扑图: 实验步骤: 1.在8.7服务器上安装相同版本…

单片机驱动多个ds18b20

目录 1设计内容 2ds18b20介绍 2.1传感器引脚及原理图 2.2寄存器配置 3程序实现 3.1配置初始化 3.2配置寄存器 3.3ROM读取 3.4温度读取 1设计内容 通过51单片机,读取总线上挂载的多个ds18b20的温度信息。 如下图,成功读取到3路温度数据。 2ds18…

MD5算法:高效安全的数据完整性保障

摘要:在数字世界中,确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中,Message Digest Algorithm 5(MD5)算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点…

双屏联动系统在展厅设计中的互动类型与效果

随着各项多媒体技术的快速发展,让展厅中的各类展项得到技术升级,其中作为电子设备中最基础的显示技术,不仅优化了内容的展示质量,还实现了更具互动性的创新技术,如双屏联动系统就是当前展厅设计中最常见的技术类型之一…

TS项目实战一:流淌的字符动画界面

使用ts实现虚拟世界,创建ts项目,并编写ts代码,使用tsc编译后直接加载到html界面,实现类似黑客帝国中的流淌的代码界面的效果。 源码下载地址:点击下载 讲解视频 TS实战项目一:数字流界面项目创建 TS实战项…

Airflow原理浅析

⭐️ airflow基本原理 Apache Airflow 是一个开源的工作流自动化工具,它用于调度和管理复杂的数据工作流。Airflow 的原理基于有向无环图(DAG)的概念,它通过编写和组织任务的有向图来描述工作流程。 以下是 Apache Airflow 的一…

解决ModuleNotFoundError: No module named ‘pysqlite2‘

目录 一、问题描述 二、问题分析 三、解决方法 四、参考文章 一、问题描述: 新建conda编译环境。安装Jupyter后打不开,报错: 二、问题分析: 缺少sqlite3动态链接库 三、解决方法: SQLite Download Page 下载…

go语言socket编程

1.互联网分层模型 过程分析: 2.Socket图解 Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数&a…

幻兽帕鲁服务器游戏怎么升级版本?

幻兽帕鲁服务器游戏怎么升级版本?自建幻兽帕鲁服务器进入Palworld游戏提示“您正尝试加入的比赛正在运行不兼容的游戏版本,请尝试升级游戏版本”什么原因?这是由于你的客户端和幻兽帕鲁服务器版本不匹配,如何解决?更新…

数学建模-多目标规划

例:求下列函数最大值 Matlab 程序: 若分开求解,即分别求出第一个函数和第二个函数的最大值,我们试一下。 第一个函数最大值(我们先求最小值) c[3 -2];A[2,3;2,1];b[18;10];Aeq[];beq[];vlb[0;0];vub[];[…

redis设计与实践的总结

Redis是一款高性能的Key-Value存储系统,它可以用作缓存、消息队列、计数器、排行榜等多种应用场景。在实际应用中,如何设计和使用Redis是非常关键的。本文将介绍Redis的设计原则和最佳实践,帮助您更好地利用Redis提高应用性能和可靠性。 ###…

kuboard-spray 导入离线资源包

下载镜像 # 1. 在一台可以联网的机器上执行 docker pull registry.cn-shanghai.aliyuncs.com/kuboard-spray/kuboard-spray-resource:spray-v2.18.0a-8_k8s-v1.23.9_v1.16-amd64 docker save registry.cn-shanghai.aliyuncs.com/kuboard-spray/kuboard-spray-resource:spray-v…

hbuilderx uniapp运行到真机控制台显示手机端调试基座版本号1.0.0,调用uni.share提示打包时未添加share模块

记录一个困扰了几天的一个蠢问题,发现真相的我又气又笑。 由于刚开始接触uniapp 移动端开发,有个需求需要使用uni.share API,但是我运行项目老提示打包时没配置share模块 我确实没在manifest内配置。网上搜了一些资料,但是我看官…

漏洞01-目录遍历漏洞/敏感信息泄露/URL重定向

目录遍历漏洞/敏感信息泄露/URL重定向 文章目录 目录遍历敏感信息泄露URL重定向 目录遍历 敏感信息泄露 于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如: ---通过访问url下的目录,可以直接列出目录下…

Python实现利用仅有像素级标注的json文件生成框标注的json文件,并存放到新文件夹

import json import os # create rectangle labels based on polygon labels, and store in a new folder def create_rectangle_shapes(polygon_shapes):rectangle_shapes []for polygon_shape in polygon_shapes:# 获取多边形的坐标点points polygon_shape[points]# 找到最…

springboot142新冠病毒密接者跟踪系统

新冠病毒密接者跟踪系统设计与实现 摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲&#xff…

Flink实战五_状态机制

接上文:Flink实战四_TableAPI&SQL 在学习Flink的状态机制之前,我们需要理解什么是状态。回顾我们之前介绍的很多流计算的计算过程,有些计算方法,比如说我们之前多次使用的将stock.txt中的一行文本数据转换成Stock股票对象的ma…

Mongodb安装Linux

确定你的CentOS 版本 使用以下命令: /etc/centos-release下载Mongodb 解压tgz压缩包 创建data和log文件夹 , 确定你的文件夹访问权限 在log文件夹里面创建mongodb.log文件(这一步很重要 ! ! !) touch mongodb.log创建mongodb.conf文件 在你的mongodb文件夹下 vi mongo…

IDEA的properties默认编码是UTF-8但是不显示中文

问题描述 今天打开IDEA项目,发现messages_zh_CN.properties不显示中文了 但奇怪的是target下的文件就是展示的中文 而且我IDEA已经配置了编码格式是UTF-8了 使用nodepad打开源文件,也是展示编码格式是UTF-8 (打开target下的文件,…

数字存内计算与云边端具有广泛的应用场景深度剖析【根据中国移动研究院文献分析总结】

文章目录 背景数字存内计算技术研究端侧应用场景边侧应用场景云侧应用场景 总结参考文献: 背景 存内计算产品基于其不同的器件特性和计算方式,能够为云、边缘和端设备提供推理、训练等多种人工智能(AI)能力,从而提升运…