Java 异常进阶

Java异常进阶 先完成Java异常入门,再完成Java进阶。1)自动关闭资源2)多异常捕获3)异常处理嵌套4)catch + throws来包装异常5)异常链追踪信息6)友好的throws语句。 阅读详情

在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能。有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常。但是在查看这些API的文档时,我们却没有办法找到有关这些异常的详尽解释。在这种情况下,我们不能简单地忽略这些由throws所声明的异常:

public void shouldNotThrowCheckedException {

// 该API调用可能抛出一个不明原因的Checked Exception

exceptionalAPI;

}

否则Java编译器会由于shouldNotThrowCheckedException函数没有声明其可能抛出的Checked Exception而报错。但是如果通过throws标明了该函数所可能抛出的Checked Exception,那么其它对shouldNotThrowCheckedException函数的调用同样需要通过throws标明其可能抛出该Checked Exception。

那我们应该如何对这些Checked Exception进行处理呢?在本文中,我们将对如何在Java应用中使用及处理Checked Exception进行简单地介绍。

Java异常简介

在详细介绍Checked Exception所导致的问题之前,我们先用一小段篇幅简单介绍一下Java中的异常。

在Java中,异常主要分为三种:Exception,RuntimeException以及Error。这三类异常都是Throwable的子类。直接从Exception派生的各个异常类型就是我们刚刚提到的Checked Exception。它的一个比较特殊的地方就是强制调用方对该异常进行处理。就以我们常见的用于读取一个文件内容的FileReader类为例。在该类的构造函数声明中声明了其可能会抛出FileNotFoundException:

public FileReader(String fileName) throws FileNotFoundException {

……

}

那么在调用该构造函数的函数中,我们需要通过try…catch…来处理该异常:

public void processFile {

try {

FileReader fileReader = new FileReader(inFile);

} catch(FileNotFoundException exception) {

// 异常处理逻辑

}

……

}

小编是一个有着5年工作经验的java程序员,对于java,自己有做资料的整合,一个完整学习java的路线,学习资料和工具,相信这里有很多学习java的小伙伴,我创立了一个2000人学习扣群,479121291。每晚都有java的直播课程。无论是初级还是进阶的小伙伴小编我都欢迎!

如果我们不通过try…catch…来处理该异常,那么我们就不得不在函数声明中通过throws标明该函数会抛出FileNotFoundException:

public void processFile throws FileNotFoundException {

FileReader fileReader = new FileReader(inFile); // 可能抛出FileNotFoundException

……

}

而RuntimeException类的各个派生类则没有这种强制调用方对异常进行处理的需求。为什么这两种异常会有如此大的区别呢?因为RuntimeException所表示的是软件开发人员没有正确地编写代码所导致的问题,如数组访问越界等。而派生自Exception类的各个异常所表示的并不是代码本身的不足所导致的非正常状态,而是一系列应用本身也无法控制的情况。例如一个应用在尝试打开一个文件并写入的时候,该文件已经被另外一个应用打开从而无法写入。对于这些情况,Java通过Checked Exception来强制软件开发人员在编写代码的时候就考虑对这些无法避免的情况的处理,从而提高代码质量。

而Error则是一系列很难通过程序解决的问题。这些问题基本上是无法恢复的,例如内存空间不足等。在这种情况下,我们基本无法使得程序重新回到正常轨道上。因此一般情况下,我们不会对从Error类派生的各个异常进行处理。而且由于其实际上与本文无关,因此我们不再对其进行详细讲解。

天使变恶魔

既然Java中的Checked Exception能够提高用户代码质量,为什么还有那么多人反对它呢?原因很简单:它太容易被误用了。而在本节中,我们就将列出这些误用情况并提出相应的网络上最为推荐的解决方案。

无处不在的throws

第一种误用的情况就是Checked Exception的广泛传播。在前面已经提到过,调用一个可能抛出Checked Exception的API时,软件开发人员可以有两种选择。其中一种选择就是在对该API进行调用的函数上添加throws声明,并将该Checked Exception向上传递:

public void processFile throws FileNotFoundException {

FileReader fileReader = new FileReader(inFile); // 可能抛出FileNotFoundException

……

}

而在调用processFile函数的代码中,软件开发人员可能觉得这里还不是处理异常FileNotFoundException的合适地点,因此他通过throws将该异常再次向上传递。但是在一个函数上添加throws意味着其它对该函数进行调用的代码同样需要处理该throws声明。在一个代码复用性比较好的系统中,这些throws会非常快速地蔓延开来。如果不去处理Checked Exception,而是将其通过throws抛出,那么会有越来越多的函数受到影响。在这种情况下,我们要在多处对该Checked Exception进行处理。

如果在蔓延的过程中所遇到的是一个函数的重载或者接口的实现,那么事情就会变得更加麻烦了。这是因为一个函数声明中的throws实际上是函数签名的一部分。如果在函数重载或接口实现中添加了一个throws,那么为了保持原有的关系,被重载的函数或被实现的接口中的相应函数同样需要添加一个throws声明。而这样的改动则会导致其它函数重载及接口实现同样需要更改。

在上图中,我们显示了在一个接口声明中添加throws的严重后果。在一开始,我们在应用中实现了接口函数Interface::method。此时在应用以及第三方应用中拥有六种对它的实现。但是如果A::method的实现中抛出了一个Checked Exception,那么其就会要求接口中的相应函数也添加该throws声明。一旦在接口中添加了throws声明,那么在应用以及第三方应用中的所有对该接口的实现都需要添加该throws声明,即使在这些实现中并不存在可能抛出该异常的函数调用。

那么我们应该怎么解决这个问题呢?首先,我们应该尽早地对Checked Exception进行处理。这是因为随着Checked Exception沿着函数调用的轨迹向上传递的过程中,这些被抛出的Checked Exception的意义将逐渐模糊。例如在startupApplication函数中,我们可能需要读取用户的配置文件来根据用户的原有偏好配置应用。由于该段逻辑需要读取用户的配置文件,因此其内部逻辑在运行时将可能抛出FileNotFoundException。如果这个FileNotFoundException没有及时地被处理,那么startupApplication函数的签名将如下所示:

public void startupApplication throws FileNotFoundException {

……

}

在启动一个应用的时候可能会产生一个FileNotFoundException异常?是的,这很容易理解,但是到底哪里发生了异常?读取偏好文件的时候还是加载Dll的时候?应用或用户需要针对该异常进行什么样的处理?此时我们所能做的只能是通过分析该异常实例中所记录的信息来判断到底哪里有异常。

反过来,如果我们在产生Checked Exception的时候立即对该异常进行处理,那么此时我们将拥有有关该异常的最为丰富的信息:

public void readPreference {

……

try {

FileReader fileReader = new FileReader(preferenceFile);

} catch(FileNotFoundException exception) {

// 在日志中添加一条记录并使用默认设置

}

……

}

但是在用户那里看来,他曾经所设置的偏好在这次使用时候已经不再有效了。这是我们的程序在运行时所产生的异常情况,因此我们需要通知用户:因为原来的偏好文件不再存在了,因此我们将使用默认的应用设置。而这一切则是通过一个在我们的应用中定义的RuntimeException类的派生类来完成的:

public void readPreference {

……

try {

FileReader fileReader = new FileReader(preferenceFile);

} catch(FileNotFoundException exception) {

logger.log(“Could not find user preference setting file: {0}”, preferenceFile);

throw ApplicationSpecificException(PREFERENCE_NOT_FOUND, exception);

}

……

}

可以看到,此时在catch块中所抛出的ApplicationSpecificException异常中已经包含了足够多的信息。这样,我们的应用就可以通过捕获ApplicationSpecificException来统一处理它们并将最为详尽的信息显示给用户,从而通知他因为无法找到偏好文件而使用默认设置:

try {

startApplication;

} catch(ApplicationSpecificException exception) {

showWarningMessage(exception.getMessage);

}

手足无措的API使用者

另一种和Checked Exception相关的问题就是对它的随意处理。在前面的讲解中您或许已经知道了,如果一个Checked Exception不能在对API进行调用的函数中被处理,那么该函数就需要添加throws声明,从而导致多处代码需要针对该Checked Exception进行修改。那么好,为了避免这种情况,我们就尽早地对它进行处理。但是在查看该API文档的时候,我们却发现文档中并没有添加任何有关该Checked Exception的详细解释:

/**

* ……

* throws SomeCheckedException

*/

public void someFunction throws SomeCheckedException {

……

}

而且我们也没有办法从该函数的签名中看出到底为什么这个函数会抛出该异常,进而也不知道该异常是否需要对用户可见。在这种情况下,我们只有截获它并在日志中添加一条记录了事:

try {

someFunction;

} catch(SomeCheckedException exception) {

// 在日志中添加一条记录

}

很显然,这并不是一种好的做法。而这一切的根本原因则是没有说清楚到底为什么函数会抛出该Checked Exception。因此对于一个API编写者而言,由于throws也是函数声明的一部分,因此为一个函数所能抛出的Checked Exception添加清晰准确的文档实际上是非常重要的。

疲于应付的API用户

除了没有清晰的文档之外,另一种让API用户非常抵触的就是过度地对Checked Exception进行使用。

或许您已经接触过类似的情况:一个类库中用于取得数据的API,如getData(int index),通过throws抛出一个异常,以表示API用户所传入的参数index是一个非法值。可以想象得到的是,由于getData可能会被非常频繁地使用,因此软件开发人员需要在每一处调用都使用try … catch …块来截获该异常,从而使代码显得凌乱不堪。

如果一个类库拥有一个这样的API,那么该类库中的这种对Checked Exception的不恰当使用常常不止一个。那么该类库的这些API会大量地污染用户代码,使得这些用户代码中充斥着不必要也没有任何意义的try…catch…块,进而让代码逻辑显得极为晦涩难懂。

Record record = null;

try {

record = library.getDataAt(2);

} catch(InvalidIndexException exception) {

…… // 异常处理逻辑

}

record.setIntValue(record.getIntValue * 2);

try {

library.setDataAt(2, record);

} catch(InvalidIndexException exception) {

…… // 异常处理逻辑

}

反过来,如果这些都不是Checked Exception,而且软件开发人员也能保证传入的索引是合法的,那么代码会简化很多:

Record record = library.getDataAt(2);

record.setIntValue(record.getIntValue * 2);

library.setDataAt(2, record);

那么我们应该在什么时候使用Checked Exception呢?就像前面所说的,如果一个异常所表示的并不是代码本身的不足所导致的非正常状态,而是一系列应用本身也无法控制的情况,那么我们将需要使用Checked Exception。就以前面所列出的FileReader类的构造函数为例:

public FileReader(String fileName) throws FileNotFoundException

该构造函数的签名所表示的意义实际上是:

必须通过传入的参数fileName来标示需要打开的文件 如果文件存在,那么该构造函数将返回一个FileReader类的实例 对该构造函数进行使用的代码必须处理由fileName所标示的文件不存在,进而抛出FileNotFoundException的情况 也就是说,Checked Exception实际上是API设计中的一部分。在调用这个API的时候,你不得不处理目标文件不存在的情况。而这则是由文件系统的自身特性所导致的。而之所以Checked Exception导致了如此多的争论和误用,更多是因为我们在用异常这个用来表示应用中的运行错误这个语言组成来通知用户他所必须处理的应用无法控制的可能情况。也就是说,其为异常赋予了新的含义,使得异常需要表示两个完全不相干的概念。而在没有仔细分辨的情况下,这两个概念是极容易混淆的。因此在尝试着定义一个Checked Exception之前,API编写者首先要考虑这个异常所表示的到底是系统自身缺陷所导致的运行错误,还是要让用户自己来处理的边缘情况。

正确地使用Checked Exception

实际上,如何正确地使用Checked Exception已经在前面的各章节讲解中进行了详细地说明。在这里我们再次做一个总结,同时也用来加深一下印象。

从API编写者的角度来讲,他所需要考虑的就是在何时使用一个Checked Exception。

首先,Checked Exception应当只在异常情况对于API以及API的使用者都无法避免的情况下被使用。例如在打开一个文件的时候,API以及API的使用者都没有办法保证该文件一定存在。反过来,在通过索引访问数据的时候,如果API的使用者对参数index传入的是-1,那么这就是一个代码上的错误,是完全可以避免的。因此对于index参数值不对的情况,我们应该使用Unchecked Exception。

其次,Checked Exception不应该被广泛调用的API所抛出。这一方面是基于代码整洁性的考虑,另一方面则是因为Checked Exception本身的实际意义是API以及API的使用者都无法避免的情况。如果一个应用有太多处这种“无法避免的异常”,那么这个程序是否拥有足够的质量也是一个很值得考虑的问题。而就API提供者而言,在一个主要的被广泛使用的功能上抛出这种异常,也是对其自身API的一种否定。

再次,一个Checked Exception应该有明确的意义。这种明确意义的标准则是需要让API使用者能够看到这个Checked Exception所对应的异常类,该异常类所包含的各个域,并阅读相应的API文档以后就能够了解到底哪里出现了问题,进而向用户提供准确的有关该异常的解释。

而对于API的用户而言,一旦遇到了一个API会抛出Checked Exception,那么他就需要考虑使用一个Wrapped Exception来将该Checked Exception包装起来。那什么是Wrapped Exception呢?

简单地说,Wrapped Exception就是将一个异常包装起来的异常。在try…catch…块捕获到一个异常的时候,该异常内部所记录的消息可能并不合适。就以前面我们已经举过的加载偏好的示例为例。在启动时,应用会尝试读取用户的偏好设置。这些偏好设置记录在了一个文件中,却可能已经被误删除。在这种情况下,对该偏好文件的读取会导致一个FileNotFoundException抛出。但是在该异常中所记录的信息对于用户,甚至应用编写者而言没有任何价值:“Could not find file preference.xml while opening file”。在这种情况下,我们就需要构造一个新的异常,在该异常中标示准确的错误信息,并将FileNotFoundException作为新异常的原因:

public void readPreference {

……

try {

FileReader fileReader = new FileReader(preferenceFile);

} catch(FileNotFoundException exception) {

logger.log(“Could not find user preference setting file: {0}” preferenceFile);

throw ApplicationSpecificException(PREFERENCE_NOT_FOUND, exception);

}

……

}

上面的示例代码中重新抛出了一个ApplicationSpecificException类型的异常。从它的名字就可以看出,其应该是API使用者在应用实现中所添加的应用特有的异常。为了避免调用栈中的每一个函数都需要添加throws声明,该异常需要从RuntimeException派生。这样应用就可以通过在调用栈的最底层捕捉这些异常并对这些异常进行处理:在系统日志中添加一条异常记录,只对用户显示异常中的消息,以防止异常内部的调用栈信息暴露过多的实现细节等:

try {

……

} catch(ApplicationSpecificException exception) {

logger.log(exception.getLevel, exception.getMessage, exception);

// 将exception内部记录的信息显示给用户(或添加到请求的响应中返回)

// 如showWarningMessage(exception.getMessage);

}

Ansys Motor-CAD:概述(EMag、THERM、LAB、MECH) 在这篇博客中,我概述了如何使用 Ansys Motor-CAD 模型、模拟、分析和后处理结果来评估电机性能,并帮助您为您的应用选择优化的电机,并通过电机设计选择实现成本效益和效率。我介绍了各种可用的电机类型、可供选择的物理模块和可配置的多物理选项。E-Mag 物理模块有许多选项卡,涵盖几何创建、材料选择、电磁设置、条件、求解器类型、解决方案模型、耦合设置等的所有设置。热物理模块有许多选项卡,涵盖几何创建、材料选择、热设置、条件、求解器类型、解决方案模型、耦合设置等的所有设置。分析结果的速度相结合。 阅读详情

相关推荐

vivado:差分信号和单端信号 的相互转换 IBUFDS OBUFDS

FPGA能处理的都是单端信号,但有些输入信号是差分的,这时候就需要把差分信号转为单端信号。

qq_52137732的博客 1万+

Java进阶one 异常

Java进阶课程的第一篇,异常相关内容。学习完基础之后就是进阶的内容了。

weixin_74735725的博客 489

奔图M6700-M6800-M7100-M7200 系列打印机拆解教程?

奔图M6700-M6800-M7100-M7200 系列打印机拆解教程?

m0_58098052的博客 1595

Java进阶05 时间API&异常

递归算法、时间API、异常

summer_9823的博客 1406

手把手教你为Multisim 14.0创建自定义元件:以SPICE模型导入为例

本文详细介绍了如何在Multisim 14.0中创建自定义元件,重点讲解了SPICE模型的导入与应用。通过系统性的步骤指南,包括元件符号设计、引脚定义、SPICE模型关联及验证测试,帮助工程师高效扩展元件库,满足特定设计需求。文章还提供了故障排除和性能优化的实用技巧,确保自定义元件在实际仿真中的可靠性。

weixin_42531163的博客 284

紫光PG2L100H平台DDR3 IP核调试实战:从AXI接口到状态机设计的避坑指南

本文详细介绍了在紫光PG2L100H FPGA平台上调试DDR3 IP核的实战经验,重点解析了AXI接口的特殊行为和状态机设计的关键技巧。通过具体代码示例和调试方法,帮助开发者规避常见陷阱,实现高性能DDR3控制器设计,达到1.2GB/s的稳定带宽。

weixin_28717969的博客 218

Java异常处理的误区与进阶技巧

在大型项目中,可能会涉及多个不同类型的业务异常。为了让异常处理更加清晰和可扩展,可以通过自定义异常的层次结构来组织异常类型。

2301_80320652的博客 841

使用C#实现Padim算法的训练和推理:智能缺陷检测的前沿技术

Padim (Patch-based Deep Image Model) 是一种用于无监督异常检测的深度学习算法。它通过提取图像中的局部特征(patch),并在这些特征上构建一个正常样本的分布模型来识别异常。无监督学习:不需要标注数据,适用于缺乏标签的情况。局部特征提取:通过卷积神经网络提取图像的局部特征(patch)。低秩近似:利用低秩近似构建正常样本的协方差矩阵,有效降低计算复杂度。鲁棒性强:能够处理多种类型的缺陷和噪声。

墨夶的博客 1013

Java 异常处理一览 | 进阶篇

前言 《Java 异常处理一览 | 基础篇》介绍了 Java 异常处理的一些基本操作,本文介绍下异常处理的一些进阶操作! try-with-resources 语句 我们在对一些资源进行操作时,经常会有固定的写法: try 中打开资源 finally 中关闭资源 比如下面这个程序: static String readFirstLineFromFileWithFinallyBlock(String path)

程序员蜗牛 890

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 442

大模型对齐的核心引擎:RLHF三阶段完整技术体系详解——从InstructGPT到ChatGPT与Claude 4.6的工程实践

RLHF从InstructGPT起步,经由ChatGPT、Claude系列的工程实践,已演变为现代大语言模型不可或缺的对齐基础设施。其三阶段流程——SFT构建基础能力基线,奖励模型将人类偏好编码为可微信号,PPO以KL约束驱动策略向偏好分布优化——构成了当代对齐技术的核心骨架。OpenAI的路线侧重于以海量人工标注和多目标奖励建模持续精细化RLHF流程,在规模与工程深度上持续推进;

nmdbbzcl的博客 1064

java 异常进阶,Java进阶教程之异常处理

程序很难做到完美,不免有各种各样的异常。比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足。为了解决这些异常,我们需要知道异常发生的原因。对于一些常见的异常,我们还可以提供一定的应对预案。C语言中的异常处理是简单的通过函数返回值来实现的,但返回值代表的含义往往是由惯例决定的。程序员需要查询大量的资料,才可能找到一个模糊的原因。面向对象语言,比如C++, Java, Python往往有...

weixin_28987465的博客 106

【AI智能体】Codex 生成高质量电商套图实战操作详解

Codex 生成高质量电商套图实战操作详解

congge 4525

Java进阶篇(四)——Java异常处理

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦。...

m0_67393039的博客 123

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java进阶 - 异常

异常的分类:运行时异常 编译时异常(编译时直接报错) 错误(error)和异常(exception)有什么区别? error代表,一般出现的错误是致命的,而且是不可挽回的,比如服务器宕机,数据库崩溃 exception:运行和编译错误,是可以挽回的,一般是程序员自己犯的错误,需要修改源代码,知道...

BIG_BIG_ZHOU的博客 255

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java进阶四—异常

自定义异常一般由企业里的架构师负责。1.第一步:创建ErrorCode接口。/*** 获取错误码* @return*//*** 获取错误信息* @return*/2.创建MyCodeEnum枚举类,编写代码实现接口中的所有方法。// 错误端口与信息NOT_FOUND_PAGE("404","找不到网站资源"),NOT_FOUND_FILE("888","找不到文件"),NOT_O_TEN("bad", "只能求10以内的加法");// 此处必须有一个code,Msg。

2301_76556912的博客 372

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java 异常进阶 多异常和自定义异常详解

java 多异常,子父类异常,自定义异常详解。

优快云 / 稀土掘金/ B站 / GitHub: Cyan_RA9 2781

Java进阶——异常

异常概述 什么是异常,java提供异常处理机制有什么用? 以下程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常 java语言是很完善的语言,提供了异常的处理方式,以下程序执行过程中出现了不正常的情况,java把该异常信息打印输出到控制台,供程序员参考。程序员看到异常信息之后,可以对程序进行修改,让程序更加的健壮。 什么是异常:程序执行过程中的不正常情况 异常的作用:增强程序的健壮性 以下程序执行控制台出现了: Exception in thread "main" java.lang.Arith

LiLi的博客 1032

java进阶之异常

0. 什么是异常 异常就是不正常的意思。 在程序中的概念就是:在程序执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 在面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象。不同的语言对异常有不同处理,java的处理方法就是进行中断处理。 异常与语法错误是两个概念,语法错误是指程序无法通过编译,无法生成对应的字节码文件。而异常是可以生成字节码文件的,只有在运行中才会发生错误。 1.异常体系 异常的根类是java.lang.Throwable。其下又有两

对于写代码这件事,我是业余的。 653

Java进阶之异常

异常 1 异常的概念 异常是指在程序运行期可能出现的非正常情况,这些情况将导致程序出错,这种出错不同于代码编写错误或程序算法出错,代码编写错误无法完成编译,而程序算法出错计算将取得错误的结果。程序出现异常时,缺省会直接造成程序的中断运行,提前预知这种异常的可能性可以补充异常处理的逻辑,从这个角度出发,异常也是一种行之有效的逻辑处理机制,在程序中声明异常或主动抛出异常也很常见。 简而言之,为了提高程序的健壮性,异常需要由程序员处理。 2 异常的体系 异常体系知识来源 异常是指由于各种不期而至的情况,导致程序中

qq_2321620071的博客 464

Java进阶总结——异常

概念 Java语言中如果某个方法不能按照正常途径处理完任务,则需要通过另外一种路径退出该方法,同时抛出一个封装有对应错误信息的对象。在这种情况下该方法的调用者无法执行这个方法,开始在异常处理器中处理对应异常。 异常体系 从上图我们可以看到Throwable是所有错误或异常的超类,而在Throwable之下一般分为Error和Exception两大类。 1.Error类是指运行时内部错误和资源耗尽错误,程序不会抛出该类对象。 2.Exception类又可分为运行时异常(RuntimeException)和受

大唐一品 260

[java进阶]——异常详解,try catch捕获异常,抛出异常

try-catch的执行原理,什么是编译异常,什么是运行异常,请举例finally关键字的作用throw与throws的区别。自定义异常的作用,有继承关系的catch语句,捕获父类异常一定放到最后

Panci_的博客 5516

JAVA进阶 —— 异常

异常体系:Error和Exception,以及异常处理方式:JVM默认处理、捕获处理try...catch和抛出异常throw、throws

hdakj22的博客 560
上一篇: java web开发工具有哪些?
下一篇: Java 程序员不容错过的开发趋势
java03_15
博客等级 码龄9年 263粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值