异常实践1

只针对不正常的情况才使用异常

异常只应该被用于不正常的条件,它们永远不应该被用于正常的控制流。《阿里手册》中:【强制】Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理,比如:NullPointerException,IndexOutOfBoundsException等等。

比如,在解析字符串形式的数字时,可能存在数字格式错误,不得通过catch Exception来实现

代码1

if (obj != null) {//...
}

代码2

try { obj.method(); 
} catch (NullPointerException e) {//...
}

主要原因有三点:

  • 异常机制的设计初衷是用于不正常的情况,所以很少会会JVM实现试图对它们的性能进行优化。所以,创建、抛出和捕获异常的开销是很昂贵的。
  • 把代码放在try-catch中返回阻止了JVM实现本来可能要执行的某些特定的优化。
  • 对数组进行遍历的标准模式并不会导致冗余的检查,有些现代的JVM实现会将它们优化掉

在 finally 块中清理资源或者使用 try-with-resource 语句

当使用类似InputStream这种需要使用后关闭的资源时,一个常见的错误就是在try块的最后关闭资源。

  • 错误示例
    public void doNotCloseResourceInTry() {FileInputStream inputStream = null;try {File file = new File("./tmp.txt");inputStream = new FileInputStream(file);// use the inputStream to read a file// do NOT do thisinputStream.close();} catch (FileNotFoundException e) {log.error(e);} catch (IOException e) {log.error(e);}
    }

    问题就是,只有没有异常抛出的时候,这段代码才可以正常工作。try 代码块内代码会正常执行,并且资源可以正常关闭。但是,使用 try 代码块是有原因的,一般调用一个或多个可能抛出异常的方法,而且,你自己也可能会抛出一个异常,这意味着代码可能不会执行到 try 代码块的最后部分。结果就是,你并没有关闭资源。

    所以,你应该把清理工作的代码放到 finally 里去,或者使用 try-with-resource 特性。

  • 方法一:使用 finally 代码块
  • 与前面几行 try 代码块不同,finally 代码块总是会被执行。不管 try 代码块成功执行之后还是你在 catch 代码块中处理完异常后都会执行。因此,你可以确保你清理了所有打开的资源。

    public void closeResourceInFinally() {FileInputStream inputStream = null;try {File file = new File("./tmp.txt");inputStream = new FileInputStream(file);// use the inputStream to read a file} catch (FileNotFoundException e) {log.error(e);} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {log.error(e);}}}
    }

    方法二:Java 7 的 try-with-resource 语法

  • 如果你的资源实现了 AutoCloseable 接口,你可以使用这个语法。大多数的 Java 标准资源都继承了这个接口。当你在 try 子句中打开资源,资源会在 try 代码块执行后或异常处理后自动关闭。

    public void automaticallyCloseResource() {File file = new File("./tmp.txt");try (FileInputStream inputStream = new FileInputStream(file);) {// use the inputStream to read a file} catch (FileNotFoundException e) {log.error(e);} catch (IOException e) {log.error(e);}
    }

 尽量使用标准的异常

代码重用是值得提倡的,这是一条通用规则,异常也不例外。

重用现有的异常有几个好处:

  • 它使得你的API更加易于学习和使用,因为它与程序员原来已经熟悉的习惯用法是一致的。
  • 对于用到这些API的程序而言,它们的可读性更好,因为它们不会充斥着程序员不熟悉的异常。
  • 异常类越少,意味着内存占用越小,并且转载这些类的时间开销也越小。

Java标准异常中有几个是经常被使用的异常。如下:

异常使用场合
IllegalArgumentException参数的值不合适
IllegalStateException参数的状态不合适
NullPointerException在null被禁止的情况下参数值为nullIndex
OutOfBoundsException下标越界
ConcurrentModificationException在禁止并发修改的情况下,对象检测到并发修改
UnsupportedOperationException对象不支持客户请求的方法

 

虽然它们是Java平台库迄今为止最常被重用的异常,但是,在许可的条件下,其它的异常也可以被重用。例如,如果你要实现诸如复数或者矩阵之类的算术对象,那么重用ArithmeticException和NumberFormatException将是非常合适的。如果一个异常满足你的需要,则不要犹豫,使用就可以,不过你一定要确保抛出异常的条件与该异常的文档中描述的条件一致。这种重用必须建立在语义的基础上,而不是名字的基础上。

最后,一定要清楚,选择重用哪一种异常并没有必须遵循的规则。例如,考虑纸牌对象的情形,假设有一个用于发牌操作的方法,它的参数(handSize)是发一手牌的纸牌张数。假设调用者在这个参数中传递的值大于整副牌的剩余张数。那么这种情形既可以被解释为IllegalArgumentException(handSize的值太大),也可以被解释为IllegalStateException(相对客户的请求而言,纸牌对象的纸牌太少)。

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

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

相关文章

Java实现 现场评委给参赛选手打分的过程

通过评委的积极参与和公正评分,可以提高评选活动的公信力和可信度。 透明性:参赛者和观众应该清楚了解评审标准和评分过程,以便能够理解评委的评判依据。 可靠性:评委评分应该具有一致性和可靠性,不受主观因素或随机误差的影响。 编写程序,Java代码实现&#xff1…

计算机组成原理:海明校验

在上图中,对绿色的7比特数据进行海明校验,需要添加紫色的4比特校验位,总共是蓝色的11比特。紫色的校验位pi分布于蓝色的hi的1, 2, 4, 8, 16, 32, 64位,是2i-1位。绿色的数据位bi分布于剩下的位。 在下图中,b1位于h3&a…

Redis分布式锁详解:原理、实现与最佳实践

Redis分布式锁详解:原理、实现与最佳实践 引言 在分布式系统中,经常需要对共享资源进行同步访问,以避免并发问题。Redis分布式锁提供了一种简单而高效的方式来实现这一需求。本文将深入探讨Redis分布式锁的工作原理、实现方法以及在实际应用…

人工智能给文化安全带来挑战

技术发展的双刃剑特性在人工智能时代尤为明显。基于人工智能的算法权力代表了新的权力结构,依托这些算法的平台正在逐渐形成一种能够单方面施加影响的新势力。由于算法技术的复杂性和专业性,加之公共权力机构在授权和监管上的不足,以及当前对…

资料分析题目类型分类

1、两期平均数比较问题(类比为两期比重比较问题) 例如:2020年,H省秋粮玉米和稻谷的市场平均交易价格分别为2.34元/公斤和2.74元/公斤,分别比上年上涨28.6%和8.7%。按此价格测算,2020年全省农户种植玉米、稻…

浅谈安科瑞ACRELCLOUD-1200光伏发电系统在建筑节能中的应用

摘要:21世纪以来,随着不可再生能源的逐渐减少,人们越来越重视能源的利用率,不断开发绿色能源。通过光伏发电系统,能够提升能源利用率,减少不可再生能源的开发。同时,也能加强我国建筑节能系统的…

【React】第二个组件的一点小问题(JSX元素需要被包裹)

能看出为什么报错吗? 它告诉我们JSX元素需要被包裹,此时只需在所有元素外套一层标签(空标签也可以哦) 专业点就是要有一个根元素 注释: ctrl / 效果是 {/* */}这样 三元运算符:同CPP 循环输出数组&#x…

每日一道算法题 面试题 08.08. 有重复字符串的排列组合

题目 面试题 08.08. 有重复字符串的排列组合 - 力扣(LeetCode) Python class Solution:def permutation(self, S: str) -> List[str]:# 以索引记录字符是否用过lelen(S)idx[_ for _ in range(le) ]# 组合得到的字符串combine[]*leans[]# 递归def fu…

Go 中使用map时注意的问题

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

面对资质申请被拒,河南企业如何调整策略再次冲刺?

当乙级风力发电资质申请未通过时,不必过于焦虑,以下是一份详细的二次申请攻略,帮助你更有条理地准备和提交申请: 一、失败原因分析与总结 查询评审意见:在收到评审结果后,首先查询并仔细阅读专家评审意见&…

利用python爬取上证指数股吧评论并保存到mongodb数据库

大家好,我是带我去滑雪! 东方财富网是中国领先的金融服务网站之一,以提供全面的金融市场数据、资讯和交易工具而闻名。其受欢迎的“股吧”论坛特别适合爬取股票评论,东方财富网的股吧聚集了大量投资者和金融分析师,他们…

vue开发网站--关于window.print()调取打印

1.vue点击按钮调取打印 点击按钮&#xff1a; 调取打印该页面&#xff1a; <div click"clickDown()">下载</div>methods: {//下载-调取打印clickDown() {window.print()}, }<style>/* 点击打印的样式 */media print {.clickDown {display: no…

推荐一款免费的GIF编辑器——【ScreenToGif编辑器】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️木道寻的主页 文章目录 &#x1f525;前言&#x1f680;素材准备&#x1f680;逐帧制作&#x1f680;保存图片⭐️⭐️⭐️总结 &#…

Flask蓝图

Flask蓝图 蓝图&#xff08;Blueprint&#xff09;在 Flask 中是一个用于组织多个模块化子应用的强大工具。它允许开发者将不同的功能模块划分到不同的包或目录中&#xff0c;使得大型项目更加易于管理和维护。 一、不使用蓝图 在不使用蓝图的情况下&#xff0c;可能会将所有…

被淘汰的.NET技术概览

最近看到一篇文章&#xff0c;讲的时.NET被淘汰的技术&#xff0c;文章大体内容如下&#xff1a; 被淘汰的.NET技术概览 1.NET Framework 4.8之前的版本 微软已于2019年11月发布了.NET Framework的最后一个版本4.8&#xff0c;并宣布在2023年11月停止对之前版本提供支持。 …

java基础学习:Class类的isAssignableFrom方法

文章目录 一、介绍2、示例 一、介绍 在Java中&#xff0c;Class类有一个名为isAssignableFrom()的方法。这个方法用于判断一个类对象是否表示指定的类的类对象、接口、超类或超接口。换句话说&#xff0c;它用于检查一个类是否是另一个类的子类、接口实现或它们本身就是同一个…

【吊打面试官系列-MyBatis面试题】MyBatis 框架适用场合?

大家好&#xff0c;我是锋哥。今天分享关于 【MyBatis 框架适用场合 &#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyBatis 框架适用场合&#xff1f; 1、MyBatis 专注于 SQL 本身&#xff0c;是一个足够灵活的 DAO 层解决方案。 2、对性能的要求很高&#…

信息检索(58):Learning to Reweight Terms with Distributed Representations

Learning to Reweight Terms with Distributed Representations 摘要1 引言2 相关工作3 准备工作3.1 分布式词向量3.2 目标术语权重3.3 术语权重和检索模型3.3.1 概率语言模型3.3.2 BM25 4 使用分布式词向量进行词项权重学习5 实验方法6 实验结果6.1 语言模型的检索结果6.2 BM2…

Java | Leetcode Java题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; public class Solution {public int hammingWeight(int n) {int ret 0;while (n ! 0) {n & n - 1;ret;}return ret;} }

MySQL之如何分析慢查询

1、一个SQL语句执行很慢&#xff0c;如何分析&#xff1f; 可使用“explain”或者“desc”命令获取MySQL如何执行select语句的信息。 语法&#xff1a;直接在select语句前加关键字 explain或desc explain select job_desc from xxl_job_info where id 1; 2、执行计划中五个重…