当前位置: 首页 > 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…...

XCTF-web-easyupload

试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

Selenium常用函数介绍

目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...