忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目

Github和Sourceforge上超过600,000个Java项目中的异常处理概述

Java是使用检查异常的少数语言之一。 它们在编译时强制执行,并且需要某种处理。 但是……实践中会发生什么? 大多数开发人员实际上处理任何事情吗? 以及他们如何做到的?

在本文中,我们将介绍滑铁卢大学最近的一项研究数据,该数据涵盖了来自GitHub和sourceforge的600,000多个Java项目中的异常使用。 让我们深入探讨并回答一些问题。

catch子句中的十大异常类型

嗯,听起来很熟悉? 最近,我们根据生产中1,000多个应用程序中的数据进行了数据紧缩后发布了结果 ,在其中我们检查了抛出的前10种异常类型。

在这种数据紧缩的情况下,研究人员分析了Github和Sourceforge上的Java项目,调查了catch子句并报告了发现的结果。 让我们看一下数据集的样子:

TopExceptionsCaughtInCatchBlocks

catch子句中排名前十的异常类型,来源:“ Java异常处理模式分析”

好吧,我们这里有什么? 研究发现,在Java项目中,检查异常占未检查异常数量的几乎三倍。 不能在这里打乱编译器。 在生产数据紧缩中 ,我们看到了相反的结果,其中未检查最高例外。

这里要注意的一个重要区别是,生产紧缩考虑了抛出类型,而本研究所指的是捕获类型,它可能与抛出对象不同/更高级别。

另一个见解是,开发人员经常使用Throwable和Exception类在顶级捕获已检查的异常。 情节变浓了 。

为了了解有关如何处理已检查的异常的更多信息,研究人员检查了Exception和Throwable处理程序。 捕获Exception的方法的78%没有捕获其任何子类,与Throwable的84%相同。 毫无意义的catch子句。

接下来,让我们找出这些catch子句中发生的事情。 也许有希望。

“大多数程序员会忽略检查的异常,而不会引起注意”

听起来不好吗? 继续阅读。 这是研究的真实,真实,正式内容。 我们中的许多人对被检查的异常有一种刺痛的蜘蛛般的感觉,但是在软件开发中,很少有数据可以为围绕实际代码样式的问题提供冷硬证明。 除了个人经历和定性研究而不是定量研究。

下表显示了在前3个检查的异常捕获块中执行的前几个操作:

TopOperationsCheckedExceptions

选中的异常捕获子句中的顶级操作,来源:“ Java异常处理模式分析”

我们看到日志语句和e.printStackTrace()在顶部,使它们成为检查异常捕获块中使用的顶部操作,这有助于调试情况并了解发生了什么。

臭名昭著的空渔获量吸引了他们。 Joshua Bloch在“ Effective Java”中描述了理想的情况:“为了捕获故障,异常的详细信息应包含促成异常的所有参数和字段的值”。 空的捕获块无法达到这个目的。

另一个常见用例是引发未检查的异常,该异常将替换已检查的异常。

Mario Fusco在他的Twitter提要上总结得很好:

但是等等,还有更多

从检查异常和未检查异常的整体情况来看,这一次仅在Github上,我们看到类似的情况,而重新引发获得了更多的欢迎:

异常处理(Github)中使用的顶级操作,来源:“ Java异常处理模式分析”

异常处理(Github)中使用的顶级操作,来源:“ Java异常处理模式分析”

总计(6,172,462)个捕获块中有20%为空。 这是很糟糕的。 将点与以下事实联系起来:在层次结构中,较高级别的异常比特定类型使用的频率更高,研究人员得出的结论是:“大多数参与者似乎将异常处理作为一项任务给予了较低的优先级,或者将异常包括在他们的任务中。仅在语言强迫他们处理检查的异常时才进行编码。”

最终,产品质量受损。

重新抛出是怎么回事?

由于在调用堆栈层次结构中引发异常是最流行的catch子句操作,因此研究人员进一步研究了哪种转换最为流行。 下表中汇总了结果:

WrappingExceptions

顶级异常转换,来源:来源:“ Java异常处理模式分析”

在#1中,将Exception转换为RuntimeException。 从任何异常类型进行的大多数转换都转换为RuntimeException,从而使未检查的异常变为选中状态。

例外最佳做法

除了数据紧缩及其洞察力之外,本文还提到了约书亚·布洛赫(Joshua Bloch)处理其著名的第二版书“有效Java”中的异常的准则(第9章)。 我们认为在此处列出它们也是一个好主意:

1.“仅在例外情况下使用例外”

异常在JVM上造成相当大的开销,将异常用于常规流控制会带来麻烦(是的,即使许多开发人员滥用了它)。 在可执行的例外情况文章中 ,我们详细介绍了这个“常规例外情况”问题。

2.“将可检查的异常用于可恢复的条件,将运行时异常用于编程错误”

这意味着,如果开发人员发现检查后的异常不可恢复,则可以将其状态包装在未经检查的异常中,然后将其抛出层次结构以进行日志记录和处理。

3.“避免不必要地使用检查的异常”

仅在无法通过正确编码API避免异常且没有其他恢复步骤时,才使用检查的异常。

4.“善用标准例外”

使用已经广泛的Java API中的标准异常可提高可读性。

5.“抛出适合抽象的异常”

在层次结构中前进时,请使用适当的异常类型。

6.“记录每种方法引发的所有异常”

当涉及异常时,没有人会喜欢惊讶。

7.“在详细消息中包含故障捕获信息”

没有有关JVM所处状态的信息,您无法做很多事情来确保不会再次发生该异常。 并不是每个人都有Takipi掩盖他们的背部。

8.“不要忽略例外”

所有异常都应导致采取某些措施,您还需要它们做什么?

要了解有关这些准则的更多信息,请查看上一篇有关可操作异常的博客文章 ,以及最近一次涵盖1000多个生产应用程序的生产数据紧缩的教训,以了解其日志中的内容以及遇到的十大异常 。

我们到底在看什么呢?

这项研究的数据来自加拿大安大略省滑铁卢大学的David R. Cheriton计算机科学学院的Suman Nakshatri , Maithri Hegde和Sahithi Thandra的研究论文 。

研究人员研究了780万个Github项目和70万个Sourceforge项目的数据库 ,提取了Java项目,并检查了BOA领域特定语言对catch块在挖掘软件存储库中的使用情况。

数据

数据集由数字

最后的想法

例外情况应保留例外情况,但是……其他情况在实践中会发生。 被检查的异常变得不受检查,到处都是空的catch块,控制流与错误流混合在一起,有很多噪音,关键数据丢失了。 一团糟。

这是我们构建Takipi的主要动机, Takipi是一个Java代理,用于监视生产中的JVM,并负责使用您需要了解异常行为(以及如何避免异常)的所有信息来填补空白。

翻译自: https://www.javacodegeeks.com/2016/06/ignore-checked-exceptions-cool-devs-based-600000-java-projects.html

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

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

相关文章

使用Boxfuse轻松在云中运行Spring Boot应用程序

几天前,我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring ,因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它,如果我可以在服务器而不是我自己…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html

Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么? 尽管上面有暗示性的形象,我们也不想发动任何不必要的圣战。 当归结为编码样式时,大多数选择都是相当随意的,并取决于个人喜好。 是的,即使在编辑器之间制表符宽度改变了&…

ES group分组聚合的坑

参考链接:https://blog.csdn.net/u010454030/article/details/71762838 ES group分组聚合的坑 原来知道Elasticsearch在分组聚合时有一些坑但没有细究,今天又看了遍顺便做个笔记和大家分享一下。 我们都知道Elasticsearch是一个分布式的搜索引擎&#xf…

字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:…

Codeforces Round #498 (Div. 3) F. Xor-Paths

题目链接&#xff1a;F. Xor-Paths 题解&#xff1a;从起点和终点双向搜索在中间相遇时更新答案 1 #include<bits/stdc.h>2 #include<set>3 #include<cstdio>4 #include<iomanip>5 #include<iostream>6 #include<string>7 #include<cst…

创建健壮的微服务架构所涉及的组件

在本文中&#xff0c;我们将简要学习构建强大的微服务应用程序所需的各种软件组件。 在简要了解每个架构组件之前&#xff0c;我们将陈述设计微服务架构时出现的一般查询。 1.微服务架构组件 每当我们创建微服务应用程序时&#xff0c;我们都会想到以下问题 我们将如何注册微…

MATLAB画图命令zz

一、散点图 1&#xff0e;1&#xff0e;命令 plot 功能 线性二维图。在线条多于一条时&#xff0c;若用户没有指定使用颜色&#xff0c;则plot循环使用由当前坐标轴颜色顺序属性&#xff08;current axes ColorOrder property&#xff09;定义的颜色&#xff0c;以区别不同的…

jax-rs jax-ws_JAX-WS入门

jax-rs jax-wsJAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API&#xff0c;用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.e…

lingo解题报告内容解释

1.2菜单介绍 1.2.1 File 1 New 新建一个窗口,当你执行这个命令时,会出现如下对话框: 你可以在对话框中选择你想要建立的类型.类型如下: 1)扩展名为(*.lg4) LG4格式是LINGO4.0的版本,是在Windows下最主要的储存文件格式,这种格式支持字体格式,自定义格式以及动态连接, LG4以二进…

OpenShift上的无痛集装箱化JBoss通用贷款处理

我们从头到尾讨论了各个层次&#xff0c;但尚未为您提供除Red Hat之外的任何应用程序开发工具。我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 容器开发套件&#xff08;CDK&#xff09; 。 到目前为止&#xff0c;您所拥有的只是一个…

多任务编程—多进程

什么是多任务编程&#xff1f; 多任务编程其实和计算机系统内核有关&#xff0c;通过程利用多个计算机内核同时执行程序&#xff0c;以此来提升程序执行的效率。 多任务编程其中包括&#xff0c;多进程、多线程和多协程&#xff0c;这三种多任务编程各有各的优点和缺点&#xf…

java锁实现_Java锁实现

java锁实现我们都将第三方库用作开发的正常部分。 通常&#xff0c;我们无法控制其内部。 JDK随附的库是一个典型示例。 这些库中的许多库都使用锁来管理争用。 JDK锁具有两种实现。 一个使用原子CAS样式指令来管理索赔过程。 CAS指令往往是最昂贵的CPU指令类型&#xff0c;并且…

洛谷 P1027 Car的旅行路线

P1027 Car的旅行路线 题目描述 又到暑假了&#xff0c;住在城市 AA 的 CarCar 想和朋友一起去城市 BB 旅游。她知道每个城市都有 44 个飞机场&#xff0c;分别位于一个矩形的 44 个顶点上&#xff0c;同一个城市中 22 个机场之间有 11 条笔直的高速铁路&#xff0c;第 II 个城市…

API

api 百科名片 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。目…

jsf标签p:ajax_JSF简单Ajax示例

jsf标签<p:ajax>今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;…

BIOS维修技术

BIOS是电脑中最基础且最重要的程序&#xff0c;为电脑提供最低级且最直接的硬件控制&#xff0c;电脑的原始操作都是依照固化在BIOS里的程序来完成的。因此如果BIOS出现故障将会导致影响电脑的正常工作。BIOS故障有很多&#xff0c;根据常见的BIOS故障现象及其产生的原因&#…

使用Java Servlet,JSP标签和Stormpath快速构建Java Web App

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 我们刚刚发布了Java SDK的主要升级版…

谚语幸运的开始

谚语:幸运的开始 今天收到一个朋友的邮件&#xff0c;打开一看&#xff0c;是幸运谚语&#xff0c;自以为谚语写的非常好&#xff0c;所以转写出来与朋友们分享&#xff01;希望你能得到幸运哦&#xff01;荷兰的谚语幸运谚语幸运的开始关于金钱&#xff1a;你有了钱&#xff…

apache camel_什么时候使用Apache Camel?

apache camelApache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题&#xff1a;企业应用程序集成&#xff08;EAI&#xff09; 由于新产品和新应用&…