Java 异常

异常概念

Java异常是程序在执行过程中发生的错误事件,它打断了正常的流程控制流

在Java中,异常被定义为一种特殊的对象,它们可以被抛出、捕获和处理。以下是关于Java异常的一些详细信息:

  • 异常分类:Java中的异常分为两大类,即检查型异常和非检查型异常。检查型异常指的是那些可能在编译时或运行时检测到的异常,通常与外部条件有关,如文件未找到(FileNotFoundException)。非检查型异常则是那些由程序员错误引起的异常,如空指针访问(NullPointerException)。
  • 异常处理机制:Java提供了try-catch-finally语句块来处理异常。在try块中,编写可能引发异常的代码;在catch块中,捕获并处理异常;而finally块包含无论是否发生异常都需要执行的代码。
  • throw和throws关键字:throw关键字用于在代码中显式地抛出一个异常,而throws关键字用于声明方法可能抛出的异常类型,这样调用者就知道需要处理哪些异常。
  • 自定义异常:如果标准的异常类型不能满足特定需求,开发者可以创建自定义异常类,通常是继承自Exception类或其子类。
  • 异常的作用:异常处理机制是一种强大的错误报告工具,它帮助开发者优雅地应对程序运行时可能遇到的各种预料之外的情况。通过适当的异常处理,可以提高程序的健壮性,使得即使在面对错误时,程序也能保持稳定运行或者以合适的方式终止。

异常体系

Java异常体系是一个面向对象的错误处理模型,它包括一系列用于处理程序运行错误的类和接口。以下是Java异常体系的几个关键组成部分:

  1. Throwable: 这是Java异常体系的根类,所有的错误和异常都是这个类的子类。它有两个主要的子类:Error和Exception。
  2. Error: 代表了那些通常不由程序来处理的严重问题,如系统崩溃、虚拟机错误、动态链接失败等。编程时一般不需要捕获或抛出这些错误。
  3. Exception: 这是程序需要处理的异常的超类。它又分为两大类:检查型异常(Checked Exceptions)和非检查型异常(Unchecked Exceptions)。
    • 检查型异常:必须显式地在代码中进行处理,否则编译器会报错。例如,IOException、SQLException等。
    • 非检查型异常:包括运行时异常(RuntimeException)及其子类,如NullPointerException、IndexOutOfBoundsException等。这些异常是由程序逻辑错误引起的,编译器不要求强制处理。
  4. 自定义异常: 如果Java的标准异常类型不能满足需求,开发者可以创建自定义异常类,通常是继承自Exception类或其子类。
  5. 异常处理机制: Java提供了try-catch-finally语句块来捕获和处理异常。try块包含可能抛出异常的代码,catch块用于捕获并处理异常,而finally块包含无论是否发生异常都需要执行的代码。
  6. throws关键字: 用于方法声明中,表示该方法可能会抛出哪些类型的异常,提醒调用者需要处理这些异常。
  7. throw关键字: 用于在代码中主动抛出异常。

throw抛出异常

 在Java中,可以使用throw关键字来抛出异常。当程序遇到某种错误条件时,可以使用throw关键字抛出一个异常对象,以便上层代码能够捕获并处理该异常。

以下是使用throw关键字抛出异常的示例代码:

public void divide(int dividend, int divisor) throws ArithmeticException {if (divisor == 0) {throw new ArithmeticException("除数不能为零");}int result = dividend / divisor;System.out.println("结果为:" + result);
}

在上面的示例中,如果传入的除数为零,则会抛出ArithmeticException异常,并附带一条错误信息"除数不能为零"。这样,调用该方法的代码就可以根据需要捕获并处理该异常。

需要注意的是,使用throw关键字抛出异常后,需要在方法声明中使用throws关键字指定可能抛出的异常类型。例如,上述示例中的divide方法使用了throws ArithmeticException来声明可能会抛出ArithmeticException类型的异常。

throws声明异常

在Java中,可以使用throws关键字来声明一个方法可能抛出的异常类型。当一个方法可能会引发异常时,可以在方法签名中使用throws关键字来指定可能抛出的异常类型。

以下是使用throws关键字声明异常的示例代码:

public void readFile(String fileName) throws FileNotFoundException, IOException {// 读取文件的代码
}

在上面的示例中,readFile方法使用了throws关键字来声明它可能会抛出FileNotFoundExceptionIOException两种类型的异常。这意味着调用该方法的代码需要处理这两种异常,或者继续向上抛出。

需要注意的是,使用throws关键字声明异常后,调用该方法的代码必须根据声明的异常类型进行异常处理。可以使用try-catch块来捕获并处理异常,或者再次使用throws关键字将异常传递给上层调用者。

try…catch捕获异常

在Java中,可以使用try-catch块来捕获和处理异常。当程序执行到可能引发异常的代码时,可以将这些代码放在try块中,然后使用catch块来捕获并处理异常。

以下是使用try-catch块捕获异常的示例代码:

try {// 可能引发异常的代码
} catch (ExceptionType1 e) {// 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e) {// 处理 ExceptionType2 类型的异常
} finally {// 无论是否发生异常都会执行的代码
}

在上面的示例中,try块中的代码是可能引发异常的部分。如果在执行过程中发生了异常,程序会跳转到与该异常类型匹配的catch块中进行处理。每个catch块可以处理一种特定类型的异常,并且可以访问异常对象以获取更多信息。

除了catch块之外,还可以使用finally块来包含无论是否发生异常都需要执行的代码。finally块中的代码会在try块执行完毕后执行,无论是否发生异常。

案例

以下是一个简单的Java异常处理代码案例:

public class ExceptionExample {public static void main(String[] args) {try {int result = divide(10, 0);System.out.println("Result: " + result);} catch (ArithmeticException e) {System.out.println("Error: " + e.getMessage());} finally {System.out.println("This will always be executed.");}}public static int divide(int a, int b) throws ArithmeticException {if (b == 0) {throw new ArithmeticException("Cannot divide by zero.");}return a / b;}
}

在这个例子中,我们定义了一个divide方法,用于执行除法运算。如果除数为零,我们抛出一个ArithmeticException异常。在main方法中,我们使用try-catch块来捕获和处理这个异常。如果没有发生异常,我们将打印出结果;如果发生了异常,我们将打印出错误信息。无论是否发生异常,finally代码块中的代码都会被执行。

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

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

相关文章

AI大模型评测问题集合

文章目录 编程能力测试工作场景价值观测试生活场景数学能力测试中文能力测试编程能力测试 第一题:Google 面试题,Python 题目 给定一组不同的整数数组,给出一个算法对这些整数进行随机排序,使每个重 排序方法的可能性相等。换句话说,给定一副牌,你要如何洗牌才能确保牌的…

vue2 mixin的用法

在 Vue 2 中,mixin 是一种分发 Vue 组件中可复用功能的非常灵活的方式。一个 mixin 对象可以包含任意组件选项。当组件使用 mixin 对象时,所有 mixin 对象的选项将被“混合”进入该组件本身的选项。 下面是如何在 Vue 2 中使用 mixin 的基本步骤&#x…

聚类分析字符串数组

聚类分析字符串数组 对多个字符串进行聚类分析旨在根据它们之间的相似度将这些字符串划分成若干个类别,使得同一类别内的字符串彼此相似度高,而不同类别间的字符串相似度低 小结 数据要清洗。清洗的足够准确,可能不需要用聚类分析了数据要…

C++ //练习 13.34 编写本节所描述的Message。

C Primer(第5版) 练习 13.34 练习 13.34 编写本节所描述的Message。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /*************************************************************************>…

机器学习笔记-01

一…AI(人工智能) 二.机器学习–是人工智能实现的途径 三.深度学习–是机器学习的一个方法 1.机器学习能做什么: 1.1 传统预测 1.2 图像识别 1.3 自然语言处理(nlp) 2.数据集包含:特征值 目标值 3.机器学…

python绘制三维图

在Python中,我们可以使用matplotlib库中的mplot3d工具包来绘制三维图。下面是一个简单的例子,绘制了一个三维的散点图和一个三维曲面图: 首先,确保已经安装了matplotlib库。如果没有,可以通过pip进行安装:…

C#中的Task:异步编程的瑞士军刀

在现代软件开发中,异步编程已经成为处理I/O密集型任务和网络操作的重要手段。C#中的Task是.NET Framework 4.0引入的一个并发编程的抽象,它在后续的.NET Core和.NET 5中得到了进一步的发展和完善。Task代表了一个异步操作,可以等待它的完成&a…

统一所有 LLM API:支持预算与速率限制 | 开源日报 No.229

BerriAI/litellm Stars: 6.7k License: NOASSERTION litellm 是一个使用 OpenAI 格式调用所有 LLM API 的工具。它支持 Bedrock、Azure、OpenAI、Cohere、Anthropic 等 100 多种 LLMs,提供企业级代理服务器和稳定版本 v1.30.2。 主要功能和优势包括: 将…

javaEE初阶——多线程(八)——常见的锁策略 以及 CAS机制

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享分治算法关于多线程进阶的章节——关于常见的锁策略以及CAS机制 如果有不足的或者错误的请您指出! 目录 多线程进阶1.常见的锁策略1.1乐观锁和悲观锁1.2重量级锁 和 轻量级锁1.…

【大数据】分布式数据库HBase

目录 1.概述 1.1.前言 1.2.数据模型 1.3.列式存储的优势 2.实现原理 2.1.region 2.2.LSM树 2.3.完整读写过程 2.4.master的作用 1.概述 1.1.前言 本文式作者大数据系列专栏中的一篇文章,按照专栏来阅读,循序渐进能更好的理解,专栏…

JS实现对用户名、密码进行正则表达式判断,按钮绑定多个事件,网页跳转

目标&#xff1a;使用JS实现对用户名和密码进行正则表达式判断&#xff0c;用户名和密码正确时&#xff0c;进行网页跳转。 用户名、密码的正则表达式检验 HTML代码&#xff1a; <button type"submit" id"login-btn" /*onclick"login();alidate…

探索企业微信助手工具:强化沟通协作,助力高效办公

随着企业信息化建设的深入发展&#xff0c;企业微信助手工具作为一种集成化、智能化的办公辅助工具&#xff0c;正逐渐受到企业的青睐。企业微信助手不仅能够帮助企业提高工作效率&#xff0c;还能增强沟通协作能力&#xff0c;为企业发展注入新的活力。本文将简要介绍企业微信…

精益思想赋能数字化转型:落地策略与实践路径

当下&#xff0c;数字化转型已不再是选择题&#xff0c;而是关乎企业生存与发展的必答题。然而&#xff0c;转型过程中如何确保效率、降低成本并快速实现价值创造&#xff0c;成为了摆在众多企业面前的难题。精益思想作为一种追求精益求精、持续改进的管理思维&#xff0c;为数…

2024最新版JavaScript逆向爬虫教程-------基础篇之面向对象

目录 一、概念二、对象的创建和操作2.1 JavaScript创建对象的方式2.2 对象属性操作的控制2.3 理解JavaScript创建对象2.3.1 工厂模式2.3.2 构造函数2.3.3 原型构造函数 三、继承3.1 通过原型链实现继承3.2 借用构造函数实现继承3.3 寄生组合式继承3.3.1 对象的原型式继承3.3.2 …

Linux 抽象命名空间(Abstract Namespace)详细介绍

Linux 抽象命名空间&#xff08;Abstract Namespace&#xff09;是 Unix 域套接字&#xff08;Unix Domain Socket, UDS&#xff09;家族中的一种特殊类型&#xff0c;用于进程间通信&#xff08;IPC&#xff09;。相比于传统的 Unix 域套接字&#xff08;文件系统命名空间和临…

stm32HAL库-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图&#xff1a; 当电流从这根电线流通&#xff0c; LED 亮。当电流不通过这根电线&#xff0c; LED 灭。 上面 PF** &#xff0c;芯片电…

MySQL面试——聚簇/非聚簇索引

存储引擎是针对表结构&#xff0c;不是数据库 引擎层&#xff1a;对数据层以何种方式进行组织 update&#xff1a;加索引&#xff1a;行级锁&#xff1b;不加索引&#xff1a;表级锁

bootstrap带左右固定列表格,列选择操作后,表头和内容无法对其问题。

通过属性showColumns: true,开始列选择后&#xff0c; &#xff08;1&#xff09;列变动后&#xff0c;列总数量依然较多存在滚动轴时&#xff0c;右侧少一部分问题。 &#xff08;2) 列变动后&#xff0c;选择列数较少时&#xff0c;左右固定列消失&#xff0c;表头和表格无法…

固态继电器:推进可再生能源系统

随着可再生能源系统的发展&#xff0c;太阳能系统日益成为现代能源解决方案的先锋。在这种背景下&#xff0c;固态继电器&#xff08;SSR&#xff09;&#xff0c;特别是光耦固态继电器的利用变得日益突出。本文旨在深入探讨SSR在可再生能源系统中的多方位应用&#xff0c;重点…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图&#xff0c;记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…