《Effective Java》第9章 异常

比较几款国际主流的电子元器件及物料清单管理软件 – 工具汇总 Arenasolution 老牌的基于云计算物料清单管理软件,bom.com就是他们家的,10天免费试用,功能被分成4个不同的产品, 和传统ERP功能上有重叠,偏向于物流生产规划,一定程度可以取代ERP的生产规划模块,平均价格70美元/月/席位。网页客户端,不支持离线   SiliconExpert 曾经的老牌物料清单管理软件,后被Arrow 收购,14天免费试用,功能被分成4个不同的产品 阅读详情

充分发挥异常的优点,可以提高程序的可读性,可靠性和可维护性,如果使用不当,它们也会带来负面影响。

1. 只针对异常的情况才使用异常 【Item 57】
1) 顾名思义,异常应该只用于异常的情况下,它们永远不应该用于正常的控制流
2) 设计良好的API不应该强迫它的客户端为了正常的控制流而使用异常
2. 对可恢复的情况使用受检异常,对编程错误使用运行时异常 【Item 58】
1) Java程序语言设计了三种可抛出的结构:
a. 受检的异常(checked exception),可恢复情形
b. 运行时异常(run-time exception),不可恢复
c. 错误(error),不可恢复
2) 三种抛出结构使用的原则是如果期望调用者能够适当地恢复,对于这种情况就应该使用受检的异常,受检的异常需要客户端强制进行try-catch处理
3) 如果程序抛出未受检的异常或者错误,往往就属于不可恢复的情形,继续执行下去有害无益
4) 用运行时异常来表明编程错误,大多数运行时异常都表示提前违例,提前违例是指API的客户没有遵守API的规范建立的约定
5) 错误往往被JVM保留用于表示资源不足,约束失败,或者其他使程序无法继续执行的条件
6) 你实现的所有未受检的抛出结构都应该是RuntimeException的子类
7) 异常也是完全意义上的对象,可以在它上面定义任意的方法,这些方法的主要用途是为捕获异常的代码提供额外的信息,特别是关于引发这个异常条件的信息
8) 受检异常往往指明了可恢复的条件
3. 避免不必要地使用受检异常 【Item 59】
1) 如果正确的使用API并不能阻止这种异常条件的产生,并且一旦产生异常,使用API的程序员可以立即采取有用的动作,这种负担就被人为是正当的
2)因为受检异常要求API的客户必须try-catch做恢复处理,因此给程序员带来一些负担,所以尽量在必要的时候再使用
3) 如果某种合理的特殊情况下在某个类中处理异常,直接往上抛,不需要为有可能有受检异常抛出的API做try-catch
4. 优先使用标准的异常 【Item 60】
1) 重用现有异常的好处:
a. 使你的API更加易于学习和使用,因为它与程序员已经熟悉的习惯用法是一致的
b. 对于用到这些API的程序而言,它们的解读性会更好,疑问它们不会出现很对程序员不熟悉的异常
c. 异常类越少,意味着内存印迹(footprint)越小,装载这些类的时间开销也越少
2) 所有错误的方法调用都可以被归结为非法参数或者非法状态
5. 抛出与抽象相对应的异常 【Item 61】
1) 更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常,这叫做异常转译,转译时同时记录低层异常的原因,有助于问题的分析
2) 这个转译之后的异常trace会有caused by链,打印出转译链便于上层理解以及分析
6. 每个方法抛出的异常都要有文档 【Item 62】
1) 始终要单独地声明受检的异常,并且利用javadoc的@throws标记,准确地记录下抛出每个异常的条件。
2) 受检的异常会在类或方法声明上明确有throws子句,未受检异常则不需要,这也是区分受检异常和未受检异常的重要标识
3) 使用javadoc的@throws标签记录下一个方法可能抛出的每个未受检异常,但是不要使用throws关键字将未受检的异常包含在方法的声明中,否则其变成了受检的异常
4) 如果在一个类中的许多方法中出于同样的原因而抛出同一个异常,在该类的文档注释中对这个异常建立文档,这是可以接受的,而不是为每个方法单独建立文档
5) 要为每个受检异常提供单独的throws子句,不要为未受检的异常提供throws子句
7. 在细节消息中包含能捕获失败的信息 【Item 63】
1) 为了捕获失败,异常的细节信息应该包含所有“对该异常有贡献”的参数和域的值,这对分析问题非常有帮助
2) 信息的内容比可理解性要重要得多,关键信息打印即可
3) 在异常的构造器而不是字符串细节信息中引入这些异常发生的关键原因信息
4) 为异常的“失败捕获”信息提供一些访问方法是合适的,提供这些方法对受检异常比未受检异常更为重要,为恢复方式提供必要的信息
8. 努力使失败保持原子性 【Item 64】
1) 一般而言,失败的方法调用应该使该对象保持在被调用之前的状态,具有这种属性的方法被成为具有失败原子性,也就是方法调用失败之后对象的状态不受本方法失败的影响
2) 获得失败原子性常见方法:
A. 设计一个不可变对象,失败原子性显而易见
B. 对于可变对象而言,获得失败原子性的方法:
a. 在执行操作之前检查参数的有效性
b. 调整计算处理过程的顺序,使得任何可能会失败的计算部分都在对象状态被修改之前发生
c. 编写一段恢复代码,类似于数据库回滚操作,在异常发生后恢复原状
d. 在对象的一份临时拷贝上操作,当操作完成之后再调用临时拷贝中的结果代替对象的内容
3) 作为方法规范的一部分,产生任何异常都应该让对象保持在该方法调用之前的状态,如果违反了这条规则,API文档就应该清楚的指明对象将处于什么样的状态
9. 不要忽略异常 【Item 65】
1) 空的catch块会使异常达不到应有的目的,一般不建议这么处理
2) 如果确定该异常不需要处理,用空的catch块代替,至少在空的catch块中用注释解释为什么可以这么做,提升代码的可读性

基于STM32、HAL库的MCP4013T-103E/CH 数字电位器驱动程序设计 define MCP4013_I2C_ADDR (0x5F << 1) // HAL库使用7位地址左移1位,或直接使用0xBE/0xBF。#include "i2c.h" // 包含你的I2C初始化相关的头文件,例如由CubeMX生成的 i2c.h。大于127的值会被截断。// MCP4013的读操作:主机发起读取请求,从机返回当前滑片位置的一个字节。// 使用HAL_I2C_Master_Transmit直接发送数据。// 使用HAL_I2C_Master_Receive读取一个字节。 阅读详情

相关推荐

自动驾驶轨迹规划算法——Apollo EM Planner

Apollo EM Planner 是百度自动驾驶系统中的轨迹规划算法,采用期望-最大化(EM)迭代优化思想。其核心是将轨迹规划分解为路径优化(E-Step)和速度优化(M-Step)两个子问题,在Frenet坐标系下交替求解。算法先通过动态规划(DP)搜索粗路径,再使用二次规划(QP)进行平滑优化,并结合障碍物信息生成安全走廊。相较Lattice、Hybrid A*等规划器,EM Planner具有更好的实时性、动态障碍物处理能力和轨迹平滑性,适用于城市道路、高速公路等复杂场景。该算法通过解耦路径与速度优

swaggytiger的博客 2665

Effective Java 第二版 第9章 异常

如果类有“状态相关(state-dependent)”的方法(即只有在特定的不可预测的条件下才可以被调用的方法),那么这个类也应该有状态测试(state-testing)的方法(即指示是否可以调用这个状态相关的方法)。这是一种错误的写法,企图利用java的错误判断机制来提高性能,因为VM对每一次的数组访问都要检查越界情况,误认为正常的循环终止检查被编译器隐藏了。方法中声明要抛出的每一个受检异常,都是对api用户的一种潜在指示:与异常相关联的条件是调用这个方法的一种可能的结果。

kaikai_sk的博客 409

TL3562/3568内核驱动移植实战:解决无锡沐创N500L-AM4网口异常问题

本文详细介绍了在TL3562/3568平台上移植无锡沐创N500L-AM4网卡驱动的实战经验,重点解决了第四个网口通讯异常问题。通过升级驱动版本至rnpgbe-0.2.3,生成关键头文件并正确配置内核,最终实现四个网口稳定工作。文章还提供了性能优化建议和避坑指南,为类似硬件驱动移植项目提供参考。

weixin_28273593的博客 180

Effective Java读书笔记(第9章-异常)

第9章  异常

lyl_tkb的专栏 566

STM32F103到F407移植OLED,为啥F4屏幕不亮?一个延时函数搞定时序问题

本文详细分析了STM32F103到F407移植OLED时屏幕不亮的问题,指出时钟频率差异导致的时序问题是关键原因。通过对比F103和F407的时钟架构差异,提供了精确延时函数的实现方法,并指导在I2C通信关键点插入适当延时,确保OLED正常显示。文章还涵盖了完整的测试方案和高级优化技巧,帮助开发者彻底解决移植中的时序问题。

weixin_30642561的博客 549

基于多时间尺度的电动汽车光伏充电站联合分层优化调度(Matlab代码实现)

该研究提出了一种电动汽车光伏充电站的分层优化调度方法,采用日前-日内两阶段协同优化框架。日前阶段通过混合整数规划对多充电站进行全局优化,以平抑电网波动和降低购电成本为目标;日内阶段基于实时数据,采用NSGA-II等算法动态分配充电功率。该方法实现了光伏高效消纳、成本节约和电网负荷平衡的有效统一。

zhangxd212489的博客 518

Effective Java笔记-第9章:异常

第57条:只针对异常的情况才使用异常 1. 使用JVM,异常处理机制做优化,是愚蠢的 2. 代码放在 try-catch 中会阻止 JVM 本来要执行的一些优化 3. 方法常常需要:知道执行结果。三种方式:异常,返回值,状态测试方法 3.1 异常:例如android蓝牙2.0连接的过程,没有抛出异常,即说明连接成功 3.2 返回值:返回null[某些方法不能准确判断返回结果,如:Iter

u012536353的专栏 545

从‘最速控制’到代码:深入拆解韩京清ADRC中TD跟踪器的fhan函数(含Matlab/Simulink实例)

本文深入解析韩京清ADRC中的fhan函数,从理论到代码实现,详细拆解其在Matlab/Simulink中的应用。通过分析最速控制问题和非线性TD的连续形式,揭示fhan函数在信号处理和噪声抑制中的独特优势,并提供工程实践中的参数整定和优化技巧。

weixin_42659194的博客 246

effective java 读书笔记---第9章 异常

57.只针对异常的情况才使用异常

玩家六的专栏 320

GB9706.1-2020应用部分如何理解?

医用电气设备对应用部分的温度限制,绝缘考核,漏电流限制要求相对设备的其他部分来说都会要求比较严格。所以,划分设备的应用部分显得非常重要。现实中,医疗器械种类繁多,形状各异,比如大家熟悉的,小的如血压计,大的设备如CT。有些时候,我们应该如何根据应用部分的定义来确定ME设备的哪些部分是应用部分呢?还有GB 9706.1-2020中关于“应用部分”的定义中注2我们又该如何理解? 看过GB 9706.1-2020的朋友应该都已经注意到,相比老版也就是07版的9706.1,应用部分的定义是相对变...

喵叫兽的博客 8294

【华为OD机试真题】282、求满足条件的最长子串的长度 | 机试真题+思路参考+代码分析 (C++、Java、Py、C语言、JS)

题目描述 >给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求: >  1、只包含1个字母(a~ z,A~Z), 其余必须是数字; 2、字母可以在子 串中的任意位置; >  如果找不到满足要求的子串,如全是字母或全是数字,则返回-1

KJ.JK 1万+

[读书笔记]《Effective Java》第9章异常

第57条:只针对异常的情况才使用异常 异常机制是用于不正常的情形,很少会有JVM实现试图对它们进行优化。在现代的JVM实现上,基于异常的模式比标准模式要慢得多。 把代码放在try-catch块中反而阻止了现代JVM实现本来可能执行的某些特定优化。 设计良好的API不应该强迫它的客户端为了正常的控制流而使用异常。如果类具有“状态相关”的方法,即只有在特定的不可预知的条件下才可以被调用的方法...

weixin_34205076的博客 112

AD9361功能介绍和使用

AD9361使用分数分频锁相环(PLL)来产生发射机和接收机本地振荡器(LO)频率和BB PLL。BB PLL 可用于数据转换、数字滤波器和 |/O 端口。PLL的参考时钟可以由外部振荡器或外部晶体(XO)和数字可编程片内可变电容提供,电容微调产生参考时钟频率,XO和微调电容的组合统称为DCXO。有多个天线输入的分集系统。接收链数据首先经过低噪声放大器(LNA),然后是同相(1)和正交(Q)放大器,混频器和频带整形滤波器,可将接收到的信号下变频为基带以进行数字化。时分双工(TDD)和频分双工(FDD)。。。

wangjie36的博客 1万+

Effective Java 2 读书笔记 第9章 异常

第57条:只针对异常的情况才使用异常 异常应该只用于异常的情况下,不该用于正常的控制流 // Horrible abuse of exceptions. Don't ever do this! try { int i = 0; while(true) range[i++].climb(); } catch(ArrayIndexOutOfBou...

econsh的专栏 223

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《Effective Java》中关于异常处理的几条建议

概要 本章是从《Effective Java》摘录整理出来的关于异常处理的几条建议。内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常第3条: 避免不必要的使用被检查的异常第4条: 尽量使用标准的异常第5条: 抛出的异常要适合于相应的抽象第6条: 每个方法抛出的异常都要有文档第7条: 在细节消息中包含失败 -- 捕获消息第8条:...

1639

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

带你快速看完9.8分神作《Effective Java》—— 异常篇(你真的会用异常吗?)

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2021年12月16日 ???? 个人简介:通信工程本硕????、阿里新晋猿同学????。我的故事充满机遇、挑战与翻盘,欢迎关注作者来共饮一杯鸡汤 ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! 豆瓣评分9.8的图书《Effective Java》,是当今世界顶尖高手Josh Bloch的著作,在我之前的文章里我也提到过,编程就像练武,既需要外在的武功招

如切如磋,如琢如磨 2691

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java异常(二) 《Effective Java》中关于异常处理的几条建议

本章是从《Effective Java》摘录整理出来的关于异常处理的几条建议。内容包括: 第1条: 只针对不正常的情况才使用异常 第2条: 对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常 第3条: 避免不必要的使用被检查的异常 第4条: 尽量使用标准的异常 第5条: 抛出的异常要适合于相应的抽象 第6条: 每个方法抛出的异常都要有文档 第7条: 在细节消息中包含失败 -

cmz的专栏 834

Effective Java 第三版 中文翻译

effective-java-third-edition 介绍 Effective Java 第三版全文翻译,纯属个人业余翻译,不合理的地方,望指正,感激不尽! 目录 推荐序 前言 致谢 第一章 引言 第二章 创建和销毁对象   本章涉及创建和销毁对象,包括何时以及如何创建它们,何时以及如何避免创建它们,如何确保它们被及时销毁,以及如何管理在销毁之前必须进行的清理操作。 第1项:考虑静态工...

Coloured_Glaze的博客 3861

Effective java 总结9-异常

异常应该只被用于异常的情况下,永远不应该用于正常的控制流设计良好的API也不应该强迫他的客户端使用异常控制流//可用for(Iteratori=collection.iterator();){}//不用try{...}

ym & blog 440

带你快速看完9.8分神作《Effective Java》—— 通用编程篇

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2021年12月16日 ???? 个人简介:通信工程本硕????、朝着优质博主努力????。我写的很慢,但敢保证每一篇都是用心写的,绝对不无聊,欢迎关注我共饮一杯鸡汤~ ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! 豆瓣评分9.8的图书《Effective Java》,是当今世界顶尖高手Josh Bloch的著作,在我之前的文章里我也提到过,编程就像练

如切如磋,如琢如磨 4048

第9章 异常

Item 57 只针对异常的情况才使用异常 try-catch滥用,其负面影响是: 异常机制初衷是针对非正常情况,所有JVM默认不对其进行优化。比如,遍历数组每次都加入try-catch,性能可能慢2倍。try-catch块,会阻止JVM对其中代码的优化悄悄掩盖隐藏的bug 在“有状态”情况下控制异常: 提供状态测试方法:如,遍历时,提供hasNext方法,用于看是否有ne

箫声清阳的空间 619

带你快速看完9.8分神作《Effective Java》—— 方法篇

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2021年12月16日 ???? 个人简介:通信工程本硕????、阿里新晋猿同学????。我的故事充满机遇、挑战与翻盘,欢迎关注作者来共饮一杯鸡汤 ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! 豆瓣评分9.8的图书《Effective Java》,是当今世界顶尖高手Josh Bloch的著作,在我之前的文章里我也提到过,编程就像练武,既需要外在的武功招

如切如磋,如琢如磨 1717

Effective Java-目录

这里写自定义目录标题

yunli0的博客 683
上一篇: 《Effective Java》第8章 通用程序设计
下一篇: 《Effective Java》第10章 并发
AnnaLoad
博客等级 码龄17年 7粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值