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);}
}

下图为例:

在这里插入图片描述



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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm 清缓存(重新安装node-modules)

安装node依赖包的会出现失败的情况,如下图所示: 此时 提示有些依赖树有冲突,根据提示 “ this command with --force or --legacy-peer-deps” 执行命令即可。 具体步骤如下: 1、先删除本地node-modules包 2、删掉page-loacl…

驱动开发,IO多路复用实现过程,epoll方式

1.框架图 被称为当前时代最好用的io多路复用方式; 核心操作:一棵树(红黑树)、一张表(内核链表)以及三个接口; 思想:(fd代表文件描述符) epoll要把检测的事件…

哨兵1号(Sentinel-1)SAR卫星介绍

1. 哥白尼计划 说起欧空局的哨兵1号,就不得不先说一下欧空局的“哥白尼计划”。 欧空局的哥白尼计划(Copernicus Programme)是欧空局与欧盟合作的一项极其重要的地球观测计划。该计划旨在提供免费开放的、可持续的地球观测数据&#xff0c…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(9 月 15 日论文合集)

文章目录 一、检测相关(6篇)1.1 ALWOD: Active Learning for Weakly-Supervised Object Detection1.2 mEBAL2 Database and Benchmark: Image-based Multispectral Eyeblink Detection1.3 Co-Salient Object Detection with Semantic-Level Consensus Extraction and Dispersio…

如何实现 pdf 转 word

前言:最直接的方式 wps 充会员可以直接转,但是单纯为了 使用这个功能有没啥必要 pdf转word方法 在线转换wps转换其他收费转换方式 在线转换 介绍在线转换,虽然样式简陋但是可以转换成功,转换以后也没有失真 http://ssyr.mynatap…

【无公网IP内网穿透】 搭建Emby媒体库服务器并远程访问「家庭私人影院」

目录 1.前言 2. Emby网站搭建 2.1. Emby下载和安装 2.2 Emby网页测试 3. 本地网页发布 3.1 注册并安装cpolar内网穿透 3.2 Cpolar云端设置 3.3 Cpolar内网穿透本地设置 4.公网访问测试 5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力…

Jenkins 页面部分显示Http状态403 被禁止

前言 生产环境Jenkins部署了一段时间了,结果今天在流水线配置中,部分页面显示Jenkins 页面部分显示Http状态403 被禁止,修改配置点击保存之后偶尔也会出现这个。 问题 以下是问题图片 解决 在全局安全配置里面,勾选上启用代…

使用ExcelJS快速处理Node.js爬虫数据

什么是ExcelJS ExcelJS是一个用于处理Excel文件的JavaScript库。它可以让你使用JavaScript创建、读取和修改Excel文件。 以下是ExcelJS的一些主要特点: 支持xlsx、xlsm、xlsb、xls格式的Excel文件。可以创建和修改工作表、单元格、行和列。可以设置单元格样式、字…

C++之operator=与operator==用法区别(二百一十八)

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

常见开源协议详解及应用案例

文章目录 0. 引言软件开源概述开源协议的重要性 1. 开源协议的几个关键概念1. 引用(Linking)2. 修改(Modification)3. 衍生品(Derivative works)4. 获取源码的权力(Right to access source code…

【mysql】1044 - Access denied for user ‘root‘@‘%‘ to database ‘test_job‘

登录mysql 为新建的库创建账号和授权 创建和授权命令 grant all on test_job.* to job% identified by 12345;flush privileges; 返回信息 grant all on test_job.* to job% identified by 12345 > 1044 - Access denied for user root% to database test_job > 查询…

linux安装常见的中间件和数据库

文章目录 一、数据库二、redis三、tomcat四、nginx五、mq六、es七、nacos八、neo4j(图数据库)九、fastdfs其他 一、数据库 linux环境上使用压缩包安装mysql【数据库】Mysql 创建用户与授权 二、redis redis是没有账号的,只能设置密码Linux…

EDA(Exploratory Data Analysis)探索性数据分析

EDA(Exploratory Data Analysis)中文名称为探索性数据分析,是为了在特征工程或模型开发之前对数据有个基本的了解。数据类型通常分为两类:连续类型和离散类型,特征类型不同,我们探索的内容也不同。 1. 特征类型 1.1 连续型特征 …

【Git】万字git与gitHub

🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理在git和GitHub时的笔记与感言 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下🫰&…

【送书活动】大模型赛道如何实现华丽的弯道超车

文章目录 导读前言AI/ML 模型训练任务对数据平台的需求01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率,降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署 核心密码01 通过数据抽象化统一数据孤岛02 通过分布…

Apache Kafka 基于 S3 的数据导出、导入、备份、还原、迁移方案

在系统升级或迁移时,用户常常需要将一个 Kafka 集群中的数据导出(备份),然后在新集群或另一个集群中再将数据导入(还原)。通常,Kafka集群间的数据复制和同步多采用 Kafka MirrorMaker&#xff0…

数据科学的文本技术 Text Technology(IR信息检索、搜索引擎)

一、文章摘要 1. 内容 * Introduction to IR and text processing, system components * Zipf, Heaps, and other text laws * Pre-processing: tokenization, normalisation, stemming, stopping. * Indexing: inverted index, boolean and proximity search * Evaluation m…

智能远程监考方案助力企业考试化繁为简

在音视频数字化之旅中,轻装上阵。 近年来,在数字化浪潮之下,远程考试频繁成为各领域热词,各企业也纷纷改革求新,将原本的企业内部考试转移到线上,从而获取更低廉的组考成本,更高的管理效率&…

ChatGPT 或其它 AI,能用在文书创作上吗?

新的申请季已经正式开始,一些热门项目的ED截止日期也不再遥远,因此很多准留学生们都已经开始了关于文书的创作。 而随着科技的不断发展,以ChatGPT为首的一众AI工具也作为一种辅助手段愈发融入了我们的生活。 那么不免就会有一些同学在准备申…

分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-BiGRU多特征分类…