当前位置: 首页 > news >正文

Java异常处理(详解)

Java异常处理

  • 前言
  • 一、异常与异常类
    • 1.异常的概念
    • 2.异常类
      • Error类
      • Exception类
        • (1)非检查异常
        • (2)检查异常
  • 二、异常处理
    • 1.异常的抛出与捕获
    • 2.try-catch-finally语句
    • 3.声明方法抛出异常
    • 3.用throw 语句抛出异常
  • 三、自定义异常类


前言

如同大多数现在现代编程一样,Java语言有着健壮的异常处理机制,将控制权从出错点转移给强壮的错误处理器,这篇文章为大家主要讲解Java的异常处理机制。


一、异常与异常类

1.异常的概念

所谓异常是在程序运行过程中产生的使程序终止正常运行的错误对象,如数组下标越界,整数除法中零作除数,文件等找不到等都可能使程序终止运行。

我们看下面的一段程序

package com.demo
public class InputChar{public static void main(String[] args){System.out.print("请输入一个字符:");char c= (char) =System.in.read(); 		//改行发生编译错误System,out.println("c= "+c);}
}

当编译该程序时会出现下列编译错误:

Unhandled exception type IOException

错误原因是程序没有处理IOException异常,该异常必须捕获或声明抛出。出现编译错误的原因是,read()方法在定义的时候声明抛出了IOException异常,因此程序中调用该方法必须对该类作异常处理



2.异常类

java语言的异常处理定义了多种类,其中所有异常类都是Throwable的子类,是Object的直接子类,Throwable有两个子类,一个是Error类,另一个是Exception类,这两个子类又分为若干个子类

下图展示了Throwable类及其常见子类的层次结构

在这里插入图片描述



Error类

Error类描述的是系统内部错误,这样的错误很少出现,如果发生了这类错误,则除了通知用户及终止程序外,几乎什么也不能做,程序中一般不对这类错误处理



Exception类

(1)非检查异常

非检查异常是RuntimeException类及其子类异常,也称为运行时异常。

常见的非检查异常如下图所示:

在这里插入图片描述

非检查异常是在程序运行时检测到的,可能发生在程序的任何地方且数量较大,因此编译器不对非检查异常(包括Error类的子类)处理,这种异常又称为免检异常


程序运行时发生非检查异常时运行时系统会把异常对象交给默认的异常处理程序,在控制台显示异常的内容及其发生异常的位置:

下面介绍几种常见的非检查异常:

  1. NullPointerException:空指针异常,即某个对象为null时调用该对象的方法或使用对象就会产生该异常
  2. ArithmeticException:算术异常,在做整数的除法或者整数的求余运算时可能产生的异常,它是在除数为0时产生的异常
  3. ClassCastException:对象转换异常,Java支持对象类型转换,若不符合转换的规定,则产生类转换异常
  4. ArrayIndexOutOfBoundsException:数组下标越界异常,当引用数组元素的下标超出范围时产生的异常。
  5. NumberFormatException:数字格式错误异常,在将字符串转换为数值时,如果字符串不能正确转换成数值则产生该异常

注意:尽管编译器不对非检查异常处理,但程序运行时产生这类异常,程序也不能正常结束,为了保证程序正常运行,要么避免产生非检查异常,要么对非异常检查进行处理



(2)检查异常

检查异常是除RuntimeException类及其子类以外的异常类,有时候也成为必检异常,对这类异常,程序必须捕获或者声明抛出,否则编译器不会通过。上图中的read()方法声明抛出的IOException异常就是必检异常。例如,若试图使用Java命令运行一个不存在的类,则会产生ClassNotFoundException异常,若调用了一个不存在的方法,则会产生NoSuchMethodException
异常



二、异常处理

1.异常的抛出与捕获

异常是在方法中产生的,方法中如果在运行过程中产生了异常,在这个方法中就产生一个代表该异常类的对象,并把它交付给系统,运行时系统寻找相应的代码来处理该异常,这个过程称为抛出异常

关于main()方法中调用情况如下图所示:

在这里插入图片描述

main()方法调用methodA()方法,methodA()调用methodB()方法,methodB()调用methodC()方法。
假如在methodC()方法中发生了异常,运行时首先在该方法中寻找处理异常的代码,如果找不到,运行时系统将在方法调用栈中回溯,把异常对象交给methodB()方法,如果methodB()方法也没有异常处理的代码,将继续回溯,直到找到处理异常的代码,最后,如果main()方法中也没有处理异常的代码,运行时系统将异常交给JVM
,JVM将在控制台显示异常信息



2.try-catch-finally语句

捕获并处理异常最常用的方法就是用try-catch-finally语句,一般格式为:

try{//需要处理的代码或者是可能会出现异常的代码
}catch(ExceptionType1 exceptionObject){//异常处理的代码
}[catch(ExceptionType1 exceptionObject)]{//异常处理的代码
}
finally{//最后处理的代码
}]

说明:
(1). catch块用来捕获异常,括号中指明捕获的异常类型及其异常引用名,类似于方法的参数,指明catch语句所处理的异常
注意:若有多个catch块,异常类型的排列顺序必须按照从特殊到一般的顺序,即子类异常放前面,父类异常放在后面,否则会产生编译错误


(2).finally块是可选项,异常的产生往往会中断应用程序的执行,而在异常产生前,可能有些资源没被释放。有时无论程序是否发生异常,都要执行一段代码,这是就可以用finally块来实现,即使是使用了return语句,finally块都会被执行,除非catch块中调用了System.exit()方法终止了程序的运行

(3).一个块中必须要有一个catch块或者finally块,即都不能单独使用


(4).catch块中可以捕获多个异常,例如:
catch(ExceptionType1 exceptionObject| Exception Type2 exception){ …}


下图展示用一个try-catch结构捕获并且处理一个ArithmeticException异常

在这里插入图片描述

注意在异常类的根类定义了其他方法:如下所示

public void printStackTrace():在标准错误的输出流上输出异常调用栈的轨迹public String getMessage():返回异常对象的细节描述public String toString():返回对象的简短描述,是Object类中同名方法的覆盖


3.声明方法抛出异常

有时候方法产生的异常不需要再该方法中处理,可能需要由该方法的调用方法处理,这是可以在声明方法时用throw子句声明抛出异常,将该异常传递给调用该方法的方法处理
按上述的方式声明的方法,就可对方法中产生的异常不作处理,若方法内抛出了异常,则调用该方法的方法必须捕获这些异常或再声明抛出

下图为例:

在这里插入图片描述


注意:前面讲到子类可以覆盖父类的方法,但若父类的方法使用throws声明抛出了异常,子类方法也可以使用throws方法声明异常。但是要注意,子类方法抛出的异常必须是父类方法抛出的异常或子异常

下面为例:

class AA{public void test() throws IOException{System.out.println("In AA's test()")}
}class BB extends AA{public void test() throws FileNotFounfException{		//允许,FileNotFounfException是IOException的子类System.out.println("In AA's test()")}
}class CC extends AA{public void test() throws Exception{		//错误,Exception是IOException的父类System.out.println("In AA's test()")}
}


3.用throw 语句抛出异常

到目前为止,处理的异常都是由程序产生的,并由程序自动抛出,然而也可以创建一个异常对象,然后用throw语句抛出,或将捕获到的异常对象由throw语句再次抛出,throw语句的格式如下

throw throwableInstance

throwableInstance可以是用户创建的异常对象,也可以是程序捕获到的异常对象,该实例必须是Throwable类或者其子类的实例

下图为例:

在这里插入图片描述

注意看图中的序号1,若去掉throw e 这个语句,那么main()主函数中将接受不到方法抛出的异常,因为该方法已经处理了这个异常,大家可以对比这两种图的结果,下图为去掉序号1语句后的结果


在这里插入图片描述



三、自定义异常类

尽管Java已经预定义了许多异常类,但有时还需要定义自己的异常。编写自定义异常类实际上是一个继承API标准异常类,用新定义的异常类处理信息覆盖原有信息的过程。

常用的编写自定义异常类的模式如下:

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

下面讨论一个例子。假设程序中需要验证用户输入的数据值是否必须是正值,可以按照以上模式编写自定义异常类如下:

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

下图为例:

在这里插入图片描述



相关文章:

Java异常处理(详解)

Java异常处理 前言一、异常与异常类1.异常的概念2.异常类Error类Exception类(1)非检查异常(2)检查异常 二、异常处理1.异常的抛出与捕获2.try-catch-finally语句3.声明方法抛出异常3.用throw 语句抛出异常 三、自定义异常类 前言 …...

嵌入式-数据进制之间的转换

目录 一.简介 1.1十进制 1.2二进制 1.3八进制 1.4十六进制 二.进制转换 2.1二进制-十进制转换 2.2八进制-十进制转换 2.3十六进制-十进制转换 2.4十进制-二进制转换 2.5十进制-八进制转换 2.6十进制-十六进制转换 2.7小数部分转换 一.简介 被传入到计算机的数据要…...

腾讯mini项目-【指标监控服务重构】2023-08-20

今日已办 PPT制作 答辩流程 概述:对项目背景、架构进行介绍(体现我们分组的区别和需求)人员:小组成员进行简短的自我介绍和在项目中的定位,分工进展:对项目进展介绍,其中a、b两组的区别和工作…...

智能文本纠错API的应用与工作原理解析

引言 在数字时代,文本撰写和传播变得日益重要,无论是在学校里写论文、在职场中发送邮件,还是在社交媒体上发表观点。然而,文字错误、标点符号错误、语法问题和不当的表达常常会削弱文本的质量,降低信息传达的效果。为…...

在springboot下将mybatis升级为mybatis-plus

在springboot下将mybatis升级为mybatis-plus 1. 整体描述2. 具体步骤2.1 更新pom引用2.2 更新yml配置2.3 更新config配置2.4 BaseEntity修改 3. 程序启动4. 总结 1. 整体描述 之前项目工程用的是mybatis,现在需要将其替换为mybatis-plus,mybatis-plus的…...

Vuex详解:Vue.js的状态管理方案

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

栈与队列经典题目——用队列实现栈

本篇文章讲解栈和队列这一部分知识点的经典题目:用栈实现队列、用队列实现栈。对应的题号分别为:Leetcode.225——用队列实现栈,。 在对两个题目进行解释之前,先回顾以下栈和队列的特点与不同: 栈是一种特殊的线性表…...

Python stomp 发送消息无法显示文本

我们向消息服务器通过 stomp 发送的是文本消息。 当消息服务器发送成功后,消息服务器上的文本没有显示,显示的是 2 进制的数据。 如上图,消息没有作为文本来显示。 问题和解决 消息服务器是如何判断发送的小时是文本还是二进制的。 根据官…...

postgresql-视图

postgresql-视图 视图概述使用视图的好处 创建视图修改视图删除视图递归视图可更新视图WITH CHECK OPTION 视图概述 视图(View)本质上是一个存储在数据库中的查询语句。视图本身不包含数据,也被称为 虚拟表。我们在创建视图时给它指定了一个…...

科技资讯|Vision Pro头显无损音频仅限USB-C AirPods Pro 2耳机

彭博社的马克・古尔曼在最新发布的推文中表示,苹果 Vision Pro 头显的无损音频仅限于 USB-C AirPods Pro 2 耳机。 新款采用 USB-C 的 AirPods Pro 2 升级到了 IP54 级别(原版不防尘,仅 IPX4 级抗水),可陪伴用户在恶劣…...

Postman应用——初步了解postman

Postman 是一个用于构建和使用 API 的 API 平台,Postman 简化了 API 生命周期的每个步骤并简化了协作,可以更快地创建更好的 API。 Postman 包含一个基于Node.js的强大的运行时,允许您向请求(request)和分组&#xff…...

分析报告显示,PHP是编程语言主力军,且在电商领域占据“统治地位”

日前有有业内专家透露了PHP语言的使用数据,并强调了PHP语言对于互联网的作用。 而根据W3 Techs发布的《全球前1000万个网站使用的编程语言分析(截至 2023.8)》中,有这样一组数据引起广泛的关注。PHP占比 77.2%、ASP占比 6.9%、Ruby 占比5.4%。 此外&am…...

关于Greenplum Platform Extension Framework(PXF)

本文翻译自 https://docs.vmware.com/en/VMware-Greenplum-Platform-Extension-Framework/6.6/greenplum-platform-extension-framework/overview_pxf.html 随着数据存储和云服务的爆炸式增长,数据现在以各种格式驻留在许多不同的系统中。通常,数据根据…...

编程获取图像中的圆半径

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 即将推出EmguCV的教程,请大家还稍作等待。 之前网友咨询如何获得图像中圆形的半径,其中有两个十字作为标定…...

什么是Scrum?如何实施Scrum(敏捷开发)以及敏捷工具

​ 什么是Scrum? Scrum是一个敏捷开发框架,它是一个增量的、迭代的开发过程。它被广泛应用于敏捷软件开发,在Scrum中,开发过程由若干个短的迭代周期组成,每个迭代周期称为一个Sprint。 那么Scrum如何实施呢&#xf…...

提升运营效率:仓储可视化的实时监控与优化

当今,仓储管理已经不再是简单的储存和分发商品的过程。随着供应链的复杂性增加,企业需要更高效的方式来管理和优化其仓储运营。在这个背景下,仓储可视化成为了一项关键的技术,它利用先进的数字化工具和数据分析来提升仓储管理的效…...

代理模式和单一职责原理一文读懂(设计模式与开发实践 P6)

文章目录 代理模式实现保护代理虚拟代理单一职责原理代理和本体 - 接口一致性虚拟代理 - 合并请求缓存代理其他代理 代理模式 定义:为一个对象提供一个代用品 & 占位符,以便 控制对他的访问 关键:不方便直接访问某个对象或不满足需要的时…...

Linux网络编程|TCP编程

一.网络基础 1.1网络发展史 Internet-“冷战”的产物 1957年10月和11月,前苏联先后有两颗“Sputnik”卫星上天 1958年美国总统艾森豪威尔向美国国会提出建立DARPA (Defense Advanced Research Project Agency),即国防部高级研究计划署&#…...

FPGA----VCU128的DDR4无法使用问题(全网唯一)

1、在Vivado 2019.1版本中使用DDR4的IP核会遇到如下图所示的错误,即便过了implementation生成了bit,DDR4也无法正常启动。 2、解决办法,上xilinx社区搜一下就知道了 AMD Customer Communityhttps://support.xilinx.com/s/article/69035?lan…...

【毕设选题】flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计:每小时成交量2.2.1 创建 es 结果表, 存放每小时的成交量2.2.2 执行 sql &#x…...

机器学习练习-决策树

机器学习练习-决策树 代码更新地址:https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释:黄海广,haiguang2000wzu.edu.cn 1.分类决策树模型是表示基于特征对实例进行分类的树形结构。决策树可以转换成一个if…...

分类预测 | Matlab实现基于LFDA-SVM局部费歇尔判别数据降维结合支持向量机的多输入分类预测

分类预测 | Matlab实现基于LFDA-SVM局部费歇尔判别数据降维结合支持向量机的多输入分类预测 目录 分类预测 | Matlab实现基于LFDA-SVM局部费歇尔判别数据降维结合支持向量机的多输入分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于局部费歇尔判别数据降维的L…...

Say0l的安全开发-代理扫描工具-Sayo-proxyscan【红队工具】

写在前面 终于终于,安全开发也练习一年半了,有时间完善一下项目,写写中间踩过的坑。 安全开发的系列全部都会上传至github,欢迎使用和star。 工具链接地址 https://github.com/SAY0l/Sayo-proxyscan 工具简介 SOCKS4/SOCKS4…...

使用FFmpeg+ubuntu系统转化flac无损音频为mp3

功能需求如上题,我们来具体的操作一下: 1.先在ubuntu上面安装FFmpeg:sudo apt install ffmpeg 2.进入有flac音频文件的目录使用下述命令: ffmpeg -i test.FLAC -c:a libmp3lame -q:a 2 output.mp3 3.如果没有什么意外的话,你就能看到你的文件夹里面已经有转化好的mp3文件了 批…...

I/O多路复用三种实现

一.select 实现 (1)select流程 基本流程是: 1. 先构造一张有关文件描述符的表; fd_set readfds 2. 清空表 FD_ZERO() 3. 将你关心的文件描述符加入到这…...

DataInputStream数据读取 Vs ByteBuffer数据读取的巨大性能差距

背景: 今天在查找一个序列化和反序列化相关的问题时,意外发现使用DataInputStream读取和ByteBuffer读取之间性能相差巨大,本文就来记录下这两者在读取整数类型时的性能差异,以便在平时使用的过程中引起注意 DataInputStream数据…...

org.apache.flink.table.api.TableException: Sink does not exists

FlinkSQL_1.12_用DDL实现Kafka到MySQL的数据传输_实现按照条件进行过滤写入MySQL_flink从kafka拉取数据并过滤数据写入mysql_旧城里的阳光的博客-CSDN博客 参考这篇文章,写了kafka到mysql的代码例子,因为自己改了表结构,运行下面代码&#x…...

【多线程】CAS 详解

CAS 详解 一. 什么是 CAS二. CAS 的应用1. 实现原子类2. 实现自旋锁 三. CAS 的 ABA 问题四. 相关面试题 一. 什么是 CAS CAS: 全称Compare and swap,字面意思:”比较并交换“一个 CAS 涉及到以下操作: 我们假设内存中的原数据 V,旧的预期值…...

卷积神经网络实现咖啡豆分类 - P7

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 目录 环境步骤环境设置包引用全局设备对象 数据准备查看图像的信息制作数据集 模型设…...

C++之默认与自定义构造函数问题(二百一十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...

设计网站登录框ps怎么做/李飞seo

问题导读:1.Flume的存在些什么问题?2.基于开源的Flume美团增加了哪些功能?3.Flume系统如何调优?在《基于Flume的美团日志收集系统(一)架构和设计》中,我们详述了基于Flume的美团日志收集系统的架构设计,以及…...

做网站域名需哪些/如何自己开发一个网站

Android camera ISP相关 术语解释(三) 之 变焦和对焦的区别: 参考网址:https://blog.csdn.net/cruelchen/article/details/9308897 变焦: zoom 变焦分为zoom out (缩小)和zoom in(放大) 对焦(调焦): focus 分为FF(手动对焦)和AF(自动对焦) 透镜的焦点(focus)与焦距(fo…...

厚街商城网站建设/上海营销seo

一、主流浏览器及其内核: 主流浏览器内核IEtridentFirefoxGeckoGoogle ChromeWebkit/blinkSafari(苹果自带)Webkit(谷歌工程师和苹果工程师一起研发的)Opera(丹麦)presto 二、主流浏览器的要求…...

公司做网站那个网站好/百度排名服务

前段有时间研究的时候,上不去,现在忙成这样,它又能上了,能上也没时间关注了。转载于:https://www.cnblogs.com/junuh/archive/2009/06/15/1503469.html...

酒店网站可以怎么做/江门关键词优化公司

补充资料:测试结果可接受性的检查和最终测试结果的确定测试结果可接受性的检查和最终测试结果的确定check of the acceptability of test results and determination of the final test resultC凡(3)二3.3d,时,取此3个结果的平均值作为最终侧…...

网站开发使用的软件/google搜索下载

随着SPA应用程序的普及,前端开发中对路由的操作越来越离不开了,目前基本上前端框架中的路由都是基于hash和history模式,在大量使用之余我们也理应该去窥探一下它他们的真面hashhash模式的原理其实非常简单,它提供了一个onhashchan…...