Java 异常处理

news2024/12/28 3:37:35

       

目录

一、异常的基本概念

二 、为何需要异常处理

三 、异常的处理

四 、异常类的继承架构

五 、抛出异常

5.1、程序中抛出异常

5.2、指定方法抛出异常

六 、自定义异常


        不管使用的那种语言进行程序设计,都会产生各种各样的错误。 Java 提供有强大的异常处理机制。在 Java 中,所有的异常封装到一个类中,程序出错时会将异常抛出。

        即使在编译的时没有错误信息产生,但在程序运行时,经常会出现一些运行时异常,这种错误对 Java 而言是一种异常,有了异常就要有相应的处理方式。

一、异常的基本概念

        异常也称为例外,是在程序运行过程中发生的、会打断程序正常执行的事件。

        如下常见的异常:

        1.1、算术异常(ArithmeticException)

        1.2、空指针异常(NullPointException),没有给对象开辟内存空间,就去操作对象。

        1.3、找不到文件异常(FileNotFoundException)

        1.4、IO流异常(IOException)

        Java 的异常处理机制也秉承着面向对象的基本思想。在 Java 中,所有的异常都是以类的类型存在。除了内置的异常之外, Java 也可以自定义异常类。此外, Java 的异常处理机制也允许自定义抛出异常。

二 、为何需要异常处理

        异常是程序运行过程中发生的事件,比如除 0 溢出,数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的健壮性,在程序设计时,必须考虑到可能发生的异常事件,并做出相应的处理。

        Java 通过面向对象的方法来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法生成代表了该异常的一个对象,并把它交给了运行时系统,运行时系统寻找相应的代码来处理这个一异常。我们把生成异常对象并把它交个运行时系统的过程称为抛出一个异常。运行时系统在方法的调用栈中查找,从生成异常的方法开始进行追溯,直到找到包含相应异常处理的方法为止,这一过程称为捕获一个异常。

        示例

public class Main {
	public static void main(String[] args) {
		int[] arr = new int[5];
		System.out.println(arr[6]);
	}
}

控制台显示

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 5
	at com.demo.Main.main(Main.java:6)

三 、异常的处理

        异常处理由 try、catch、finally等 3 个关键字所组成的程序块,语法格式:

public class Main {
	
	public static void main(String[] args) {
		try {
			
			// 需要检查的程序语句
		} catch (Exception e) {// Exception:异常类 e 对象名称
			//异常发生时的处理语句
		}finally {
			// 一定会运行到的程序代码
		}
	}
	
}

        try 程序块若是有异常发生,程序的运行便中断,并抛出 "异常类所产生的对象"。

        抛出的对象如果属于 catch() 括号中内欲捕获的异常的类, catch 则会捕捉此异常,然后进到 catch 的块里继续运行。

        无论 try 程序块是否捕捉到异常,或者捕捉到的异常是否与 catch() 括号里的异常相匹配,最后一定会运行 finally 块里的程序代码。

        finally 的程序代码块运行结束后,程序再回到 try-catch-finally 块之后继续执行。

        其实在异常捕捉的的过程做了两个判断:第 1 个是 try 程序块是否有异常产生,第 2 个是产生的异常是否和 catch() 括号内欲捕获的异常相匹配。

        其中 finally 块是可以省略的,如果省略 finally 块不写,那么在 catch() 块运行结束后,程序将跳到 try-catch 块之后继续执行。

        大致流程如下:

        异常处理示例

public class Main {
	public static void main(String[] args) {
		int arr[] = new int[5];
		try {// 异常检查代码块
			arr[7] = 7; // 异常代码
		} catch (ArrayIndexOutOfBoundsException	 e) {// 捕获异常代码块
			System.out.println("数组越界异常");  
		}finally {// 异常一定执行代码块,这里一般资源关闭,例如io的关闭
			System.out.println("一定执行的代码块");
		}
		System.out.println("执行main方法");
	}
}

        控制台显示

数组越界异常
一定执行的代码块
执行main方法

        异常发生时,通常可以用两种方式来处理,一种交由 Java 默认的异常处理机制来处理,但这种处理方式, Java 通常只能输出异常信息,接着便终止程序的运行。

        Java 默认的异常处理机制的显示如下图所示

        另外一种方式是自行编写的 try-catch-finally 块来捕获异常。自行编写的程序代码来捕捉异常最大的好处是:可以灵活操控程序的流程,并且可以做出合适的处理。

        异常处理机制选择流程:

四 、异常类的继承架构

        异常类可以分两大类:java.lang.Exception 类与 java.lang.Error 类。这两个类均继承自 java.lang.Throwable 类。下图为 Throwable 类的继承关系图。

        习惯上将 Error 与 Exception 类统称为异常类,但这两者本质上还是不同的。Error 类专门用来处理严重影响程序运行的错误,可是通常程序设计者不会设计程序代码去捕获这种错误,其原因在与即使捕捉到它,也无法给与适当的处理,如 java 虚拟机错误就是属于一种 Error。

        不同于Error 类,Exception 类包含了一般性的异常,这些异常通常在 捕捉到之后便可做妥善的处理,以确保程序继续运行,如空指针异常、数组越界异常等就是属于这类异常。

        从异常类的继承架构图中可以看出,Exception 类扩展出了数个子类,其中 IOException 和 RunntimeException 是比较常用的两种,RunntimeException 即使不编写异常处理的程序代码,依然可以编译成功,而这种异常必须是在程序运行才可有可能发生,例如数组的索引超出了范围(数组越界异常)。与 RunntimeException 不同的是,IOException 一定要编写异常处理的程序代码才行,它通常来处理输入/输出相关的操作,如文件的访问、网络的连接等。

五 、抛出异常

        try-catch-finally 程序块的编写可以捕捉到异常,抛出异常需要用到 throw 关键字。抛出异常主要有两种方式(程序中抛出异常与指定方法抛出异常)。

5.1、程序中抛出异常

        语法

    throw 异常类示例对象

        示例

public class Main {
	public static void main(String[] args) {
		int a = 1;
		int b = 0;
		try {
			
			if(b==0){
				throw new ArithmeticException("抛出一个算数异常");
			}else {
				System.out.println(a/b);
			}
		} catch (ArithmeticException e) {
			System.out.println("抛出异常为"+e);
		}
		
	}
}

控制台显示

抛出异常为java.lang.ArithmeticException: 抛出一个算数异常

5.2、指定方法抛出异常

        如果方法内的程序代码可能会发生异常,且方法内又没有使用任何的代码块来捕捉这些异常,则必须在声明方法时一并指明所有可能发生的异常,以便让调用此方法的程序得以做好准备来捕捉异常。也就是说,如果方法会抛出异常,则可将处理此异常的 try-catch-finally 块写在调用此方法的程序代码内。

        如果要由方法抛出异常,则方法必须用下面的语法来声明。

方法名称(参数  ...) throws 异常1,异常2 .....

        示例

public class Main {
	
	
	void add(int a,int b) throws Exception{ //throws 声明抛出异常,调用者去处理异常
		int c = a/b;
		System.out.println(c);
		
	}
	
	public static void main(String[] args) {
		Main main = new Main();
		
		// 调用者处理异常
		try {
			main.add(4, 0);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

六 、自定义异常

        为了处理各种异常, Java 可通过继承的方式编写自己的异常类。因为所有可处理的异常均继承自 Exception 类,所以自定义的异常类也必须继承这个类。自定义异常语法如下:

class 异常名称 extends Exception {

}

        自定义异常示例

public class DefaultException extends Exception {

	public DefaultException() {
		super();
	}

	public DefaultException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
	}

	public DefaultException(String message, Throwable cause) {
		super(message, cause);
	}

	public DefaultException(String message) {
		super(message);
	}

	public DefaultException(Throwable cause) {
		super(cause);
	}
	
	public static void main(String[] args) {
		try {
			throw new DefaultException("抛出自定义异常");
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}

控制台显示

DefaultException: 抛出自定义异常

        在 JDK 中提供的大量 API 方法之中含有大量的异常类,但这些类在实际开发中往往并不完全满足设计者对程序异常处理的需要,在这个时候就需要用自己去定义所需的异常类,用一个类清楚地写出所需要处理的异常。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商业银行普惠金融可持续发展综合能力呈现梯队化,专项领域各有所长

易观分析:普惠金融有别于传统的金融体系,强调构建包容性、公平性的金融服务生态,商业银行提升可持续发展的综合能力需关注五个方面的因素:获客能力上以普惠客群的金融需求为锚点,增强银行服务生态的多样性,…

罗正雄:基于展开交替优化的盲超分算法DAN

SFFAI 90—超分辨率专题《罗正雄:基于展开交替优化的盲超分算法》 退化表达式为: 盲超分就是已知y,求x 这个求解过程可以表示为如下最优化问题:求出使得以下表达式最小的k和x值 盲超分存在的挑战 病态:退化过程会损…

Leetcode 891. 子序列宽度之和

一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大,请返回对 109 7 取余 后的结果。子序列 定义为从一个数组里删除一些(或者不删除&#xf…

基于matlab目标雷达横截面建模(附源码)

目录 一、介绍 二、简单点目标 RCS 三、复杂目标RCS 四、四个散射体组成的目标进行建模 五、具有多个散射体的扩展目标的宽带RCS 六、波动目标RCS 七、偏振目标RCS 八、结论 九、程序 此示例演示如何以不断提高的保真度对雷达目标进行建模。该示例介绍了简单点目标的雷…

MYSQL索引详解和优化

索引的定义 我们在看书的时候,都知道有目录,我们可以通过目录快速的找到书中的内容,而书中的目录就是充当书的索引。在数据库中的索引也是一样的。 索引的定义: 索引是帮助存储引擎快速获取数据的一种数据结构,即数据…

flex设置为1后为什么要设置width为0,和布局超出省略号为什么会超出容器,为什么会没有用

前言 最近在做手机端的页面,制作过程出现了flex布局的一些问题,再次记录在解决办法关于在flex:1的情况下设置为width的效果 如果没有设置width,当内部元素的内容大小超过平均分配的剩余空间时,元素的宽度等于内容大小,如果设置了width并且这个width的大小小于平均分配的剩余空…

[Linux] 如何查看内核 Kernel 版本(查多个Kernel的方法)

上图来源于:turnoff.us,描述了Linux内核结构,有兴趣的同学可以访问原址看看 文章目录什么是Linux内核查看Linux内核Kernel的场景情况查看 Kernel 的几种方式1、使用 uname2、使用 hostnamectl 命令3、查看 /proc/version4、使用 rpm 命令5、使…

2.9 场景式文案,原来是这样子写的【玩赚小红书】

人的生活,就是一个场景连着另一个场景,循环往复,朝朝暮暮。 文案,只要切入了用户的场景,就可以切入他的生活,进而切入他的心。 什么是「 场景化文案」 ?可以看一组对比: 非场景文…

Tomcat的概述、部署、优化

文章目录一、Tomcat概述1、Tomcat的概念2、Tomcat的核心组件3、Java Servlet 的概念4、JSP的概念5、Tomcat顶层架构6、Container 结构分析:7、Tomcat请求过程二、Tomcat服务部署1、Tomcat服务部署的步骤1.1 关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下1.2 安…

C语言第十课(上):编写井字棋游戏(综合练习1)

目录 前言: 一、文件建立: 1.头文件game.h: 2.函数定义文件game.c: 3.工程测试文件test.c: 二、编写井字棋游戏: 1.程序整体执行思路: 2.menu菜单函数实现: 3.game游戏函数逻辑&am…

Linux环境下基于VSCode和CMake实现C/C++开发

layout: post title: Linux环境下基于VSCode和CMake实现C/C开发 description: Linux环境下基于VSCode和CMake实现C/C开发 tag: 开发工具 文章目录Linux开发环境Linux目录结构常用指令选项ls:list directory contentscd:change directorytouch&#xff1a…

【附源码】计算机毕业设计JAVA校园讲座管理

【附源码】计算机毕业设计JAVA校园讲座管理 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…

linux驱动之mmap地址映射

应用场景 首先在linux中应用程序无法是直接访问驱动程序的数据的, 需要通过 copy_to_user 和 copy_from_user才能实现数据传输, 那么数据量大了以后如LCD的数据, 那么就会有很长的耗时, 为了解决这一问题, 引入mmap, 将底层物理地址映射出来, 让应用程序得以直接读写这一块内存…

Linux进程控制(下)--->进程程序替换

文章目录什么是进程程序替换为什么要进行进程程序替换怎么进行进程程序替换execlexecvexeclpexecvpexecleexecvpe使用c的可执行程序调用一个python脚本如何理解进程程序替换进程程序替换接口的返回值从进程独立性体会程序替换什么是进程程序替换 在讲进程程序替换之前&#xf…

[附源码]java毕业设计兰州市邮政公司新邮预订户管理信息系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

计算机毕业设计springboot+vue+elementUI在线漫画周边销售购物交流系统

项目介绍 任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场进行调研,漫画需求进行分析,概要设计,系统详细设计,测试和编码等步骤,设计并实现了“漫画之家”系统 。系统选用…

web前端设计与开发期末作品_期末大作业-疫情

Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业,击疫情致敬逆行者感人类题材 | 致敬逆行者网页设计作品 | 大学生抗疫感动专题网页设计作业模板 | 等网站的设计与制作 | HTML期末大学生网页设计作业 HTML&#xff1a…

大一学生Web课程设计 红酒美食主题网页制作(HTML+CSS+JavaScript)

Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | HTML期末大学生网页设计作业 HTML:结构 CSS:样式 在操作方面上运…

通用后台管理系统前端界面Ⅵ——首页、登录页、404页面

登录页 1、为了方便起见,先将element-ui的使用改为全局引入的方式。修改main.js文件如下: import Vue from vue import App from ./App.vue import ElementUI from element-ui import element-ui/lib/theme-chalk/index.css //这个是局部引入&#xff0…

idea创建javaweb项目步骤超详细(2022最新版本)

目录 前言: 一、新建文件 1.在idea里面点击文件-新建-项目 2.新建项目-更改名称为自己想要的项目名称-创建 3.右键自己建立的项目-添加框架支持 4.勾选Web应用程序-确定 5.建立成功界面 二、配置tomcat 6.点击添加配置文件 7.点击这个 8.选择这个tomcat的本…