小菜:Java异常处理的10个最佳实践

转载自   小菜:Java异常处理的10个最佳实践

异常处理在编写健壮的 Java 应用中扮演着非常重要的角色。异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用、非法的输入、null 输入等等。Java 提供很多异常处理特性,通过内置的 try、catch、finally关键字实现。Java 同样允许创建新的异常和使用 throw 和 throws 抛出该异常。在实践中,异常处理不单单是知道语法这么简单。编写健壮的代码更像是一种艺术,而不是一门科学,在接下来的文章中,我们将讨论 Java 异常处理的最佳实践。这些最佳实践遵循标准的 JDK 库,以及几个开源代码库,来更好地应对错误和异常处理。这还是为 Java 程序员提供的编写健壮代码的袖珍参考手册。

编程中异常处理的最佳实践

这里是我收集的Java编程中异常处理的10个最佳实践。大家对 Java 中的受检异常(checked Exception)褒贬不一,这种语言特性要求该异常必须被处理。在本文中,我们尽可能少使用受检异常,同时也要学会在 Java 编程中,区别使用受检和非受检异常。

1)为可恢复的错误使用受检异常,为编程错误使用非受检异常。

对 Java 开发者来说,选择受检还是非受检异常总是让人感到困惑。受检异常保证你会针对错误情况提供异常处理代码,这是一种从语言层面上强制你编写健壮代码的一种方式,但同时也引入大量杂乱的代码并导致其可读性变差。当然,如果你有可替代方式或恢复策略的话,捕获异常并做处理看起来似乎也合情合理。在 Java 编程中选择受检异常还是运行时异常的更多信息,请参考 checked vs unchecked exceptions。

2)在 finally 程序块中关闭或者释放资源

这是 Java 编程中一个广为人知的最佳实践和一个事实上的标准,尤其是在处理网络和 IO 操作的时候。在 finally 块中关闭资源能保证无论是处于正常还是异常执行的情况下,资源文件都能被合理释放,这由 finally 语句块保证。从 Java7 开始,新增加了一项更有趣的功能:自动资源管理,或者称之为ARM块。尽管如此,我们仍然要记住在 finally 块中关闭资源,这对于释放像 FileDescriptors 这类资源至关重要,因为它在 socket 和文件操作中都会被用到。

3)在堆栈信息中包含引起异常的原因

Java 库和开源代码在很多情况下会将一种异常包装成另一种异常。这样记录和打印根异常就变得非常重要。Java 异常类提供了 getCause() 方法来获取导致异常的原因,这可以提供更多有关异常发生的根本原因的信息。这条实践对调试或排除故障大有帮助。在把一个异常包装成另一种异常时,记住需要把源异常传递给新异常的构造器。

4)始终提供异常的有意义的完整信息

异常信息是最重要的,在其中,你能找到问题产生的原因,因为这是出问题后程序员最先看到的地方。记得始终提供精确的真实的信息。例如,对比下面两条 IllegalArgumentException 的异常信息:

message 1: “Incorrect argument for method”

message 2: “Illegal value for ${argument}: ${value}

第一条消息仅说明了参数是非法的或不正确的,但第二条消息包括了参数名和非法值,这对找到错误原因很重要。在编写异常处理代码的时候,应当始终遵循该 Java 最佳实践。

5)避免过度使用受检异常

受检异常的强制性在某种程度上具有一定的优势,但同时它也使得代码可读性变差,混淆了正常的业务逻辑代码。你可以通过适度使用受检异常来最大限度地减少这类情况的发生,这样可以得到更简洁的代码。你同样可以使用 Java7 的新功能,比如在一个catch语句中捕获多个异常,以及自动管理资源,以此来移除一些冗余的代码。

6)将受检异常转为运行时异常

这是在诸如 Spring 之类的框架中用来减少使用受检异常的方式之一,大部分 JDBC 的受检异常都被包装进 DataAccessException 中,DataAccessException异常是一种非受检异常。这个最佳实践带来的好处是可以将特定的异常限制到特定的模块中,比如把 SQLException 抛到 DAO 层,把有意义的运行时异常抛到客户端层。

7)记住异常的性能代价高昂

需要记住的一件事是异常代价高昂,同时让代码运行缓慢。假如你有一个方法从 ResultSet 中进行读取,它经常会抛出 SQLException 而不是将 cursor 移到下一元素,这将会比不抛出异常的正常代码执行的慢的多。因此最大限度的减少不必要的异常捕捉,去修复真正的根本问题。不要仅仅是抛出和捕捉异常,如果你能使用 boolean 变量去表示执行结果,可能会得到更整洁、更高性能的解决方案。修正错误的根源,避免不必要的异常捕捉。

8)避免空的 catch 块

没有什么比空的 catch 块更糟糕的了,因为它不仅隐藏了错误和异常,同时可能导致你的对象处于不可用状态或者脏状态。空的 catch 块没有意义,除非你非常肯定异常不会以任何方式影响对象的状态,但在程序执行期间,用日志记录错误依然是最好的方法。这在 Java 异常处理中不仅仅是一个最佳实践,而且是一个最通用的实践。

9)使用标准异常

第九条最佳实践是建议使用标准和内置的 Java 异常。使用标准异常而不是每次创建我们自己的异常,这对于目前和以后代码的可维护性和一致性,都是最好的选择。重用标准异常使代码可读性更好,因为大部分 Java 开发人员对标准的异常更加熟悉,比如 JDK 中的RuntimeException,IllegalStateException,IllegalArgumentException,NullPointerException,他们能立马知道每种异常的目的,而不是在代码或文档里查找用户自定义异常的目的。

10)为方法抛出的异常编写文档

Java 提供了 throw 和 throws 关键字来抛出异常,在 javadoc 中可以用@throw 为任何可能被抛出的异常编写文档。如果你编写 API 或者公共接口,这就变得非常重要。当任何方法抛出的异常都有相应的文档记录时,就能潜在的提醒任何调用该方法的开发者。


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

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

相关文章

JavaScript的正则表达式实现邮箱校验

说到html5&#xff0c;在说邮箱校验&#xff0c;聪明的人已经想到了直接写个 电子邮箱&#xff1a;<input type"email" name"email">这样不就是自动校验邮箱了么。。。。 不错&#xff0c;这样也可以&#xff0c;但是我要说的是&#xff1a;在没有…

微软说它深爱着Linux,现在它用行动证明了

6.27 清晨&#xff0c;微软在Red Hat DevNation大会上正式发布了.NET Core以及ASP.NET Core 1.0&#xff0c;并提供了下载&#xff0c;其不仅能在Windows操作系统上运行&#xff0c;还能在Linux和Mac OS X操作系统上运行&#xff0c;这意味着开发者不仅能使用它来建立自己的应用…

php file_put_contents(quot;,php file_put_contents函数怎么用?

file_put_contents()是PHP中的是一个内置函数&#xff0c;用于将字符串写入文件。用户想要写入的文件的路径和必须写入的数据作为参数传递给函数&#xff0c;并返回成功时写入文件的字节数&#xff0c;失败时返回FALSE。php file_put_contents()函数怎么用&#xff1f;php file…

jdk1.8.0_45源码解读——ArrayList的实现

转载自 jdk1.8.0_45源码解读——ArrayList的实现 一、ArrayList概述 ArrayList是List接口的可变数组的实现。实现了所有可选列表操作&#xff0c;并允许包括 null 在内的所有元素。除了实现 List 接口外&#xff0c;此类还提供一些方法来操作内部用来存储列表的数组的大小。  …

.NET Core dotnet 命令大全

dotnet 命令大全&#xff0c;让你理解dotnet 命令。 本文将以一个实例串起 dotnet 所有命令&#xff0c;让你玩转dotnet 命令。 本篇文章编写环境为windows 10 &#xff0c;dotnet 命令同样适用于其它系统。 配合 VS Code 你就可以在 Linux 、MAC 上开发.NET Core。 下面是dotn…

java异常 字节码,Java字节码角度分析异常处理

目录从字节码角度来分析&#xff1a;异常处理1.1 异常-catch// 从字节码角度来分析&#xff1a;异常处理public class T13_ByteAnalyseException {public static void main(String[] args) {int i 0;try {i 10;} catch (Exception e) {i 20;}}}注意&#xff1a;为了抓住重点…

html特效大全1

提前声明&#xff1a;好久之前的文档&#xff0c;找不着出处&#xff0c;如有侵权&#xff0c;联系本人&#xff0c;马上处理&#xff01; 1) 贴图&#xff1a;<imgsrc"图片地址"> 2)加入连接&#xff1a;<a href"所要连接的相关地址">写上你…

.Net Core 系列:1、环境搭建

前言&#xff1a; 2016年6月28日微软宣布发布 .NET Core 1.0、ASP.NET Core 1.0 和 Entity Framework Core 1.0。 .NET Core是微软在两年前发起的开源跨平台.NET框架项目&#xff0c;支持Windows、OS X和Linux平台&#xff0c;可用于开发各种类型的应用。此次发布包括了 .NET C…

【集合框架】JDK1.8源码分析之HashMap(一)

转载自 【集合框架】JDK1.8源码分析之HashMap&#xff08;一&#xff09;一、前言在分析jdk1.8后的HashMap源码时&#xff0c;发现网上好多分析都是基于之前的jdk&#xff0c;而Java8的HashMap对之前做了较大的优化&#xff0c;其中最重要的一个优化就是桶中的元素不再唯一按照…

java 连接 sql2005,java与sql server2005 连接有关问题

当前位置:我的异常网 Eclipse java与sql server2005 连接有关问题java与sql server2005 连接有关问题www.myexceptions.net 网友分享于&#xff1a;2013-01-27 浏览&#xff1a;73次java与sql server2005 连接问题package com.lzw.dao;import internalFrame.guanli.Item;imp…

微软借Bletchley项目将云计算信息加入区块链

在比特币领域大获成功后&#xff0c;越来越多的行业开始尝试通过区块链&#xff08;Blockchain&#xff09;技术在自己的业务中实施分布式分类帐&#xff08;Ledger&#xff09;。 InfoQ 什么是区块链 区块链是一种用于创建数字交易分类帐的数据结构&#xff0c;或有关某笔交易…

php定时某个时间循环做,PHP定时循环执行脚本

代码如下&#xff1a;<?php ignore_user_abort(); //关掉浏览器&#xff0c;PHP脚本也可以继续执行.set_time_limit(0); // 通过set_time_limit(0)可以让程序无限制的执行下去$interval 43200; // 每隔*秒运行&#xff0c;这里是12小时执行一次$is_send true;//是否开启t…

LinkedList 的实现原理浅析

转载自 LinkedList 的实现原理浅析 LinkedList内部结构 查看LinkedList的源码&#xff0c;发现其继承自AbstractSequentialList&#xff0c;实现了List&#xff0c;Deque&#xff0c;Cloneable以及Serializable接口&#xff0c;如&#xff1a; 也就意味着&#xff1a; Linked…

移植.NET Core计划,整合各平台变得更简单了!

在前篇文章中我提到了如何移植 .NET Core&#xff0c;并邀请使用者们不吝啬的回报您的使用经验和改进意见。 这项措施带动起了非常多使用者之间的讨论。 根据这些讨论的重点和我们与第一与第三方伙伴合作的经验&#xff0c;我们决定把核心 API 跟其他 .NET 平台&#xff0c;主要…

browserquest php安装,请问一下browserquest-php项目换成GatewayWorker的形式需要怎么部署worker...

单进程模式用户间数据容易共享browserquest本身就设计成单进程模式&#xff0c;单进程模式用户间数据容易共享&#xff0c;不用频繁的进程间通讯&#xff0c;开发简单。改成gateway网关模式利弊如果要改成多进程gateway网关模式&#xff0c;代码改动量会很大&#xff0c;要求开…

Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

转载自 Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列&#xff0c;相当于 动态数组。与Java中的数组相比&#xff0c;它的容量能动态增长。它继承于AbstractList&#xff0c;实现了List, Random…

ASP.NET Core 介绍

原文&#xff1a;Introduction to ASP.NET Core作者&#xff1a;Daniel Roth、Rick Anderson、Shaun Luttin翻译&#xff1a;江振宇(Kerry Jiang)校对&#xff1a;许登洋(Seay)、魏美娟(初见)、姚阿勇(Mr.Yao) ASP.NET Core 是对 ASP.NET 的一次意义重大的重构。本文介绍了 ASP…

计量经济学自相关matlab,计量经济学 自相关性.ppt

(3)检验自相关性 ①残差图分析&#xff1a;在方程窗口中点击Resids按钮&#xff0c;所显示的残差图(图5.3.7所示)表明e呈现有规律的波动&#xff0c;预示着可能存在自相关性。 图5.3.7 残差图 运用GENR生成序列E&#xff0c;观察E&#xff0c;E(-1)图形(见图5.3.8)。 图5.3.8 E…

Java 并发工具包 java.util.concurrent 用户指南

转载自 Java 并发工具包 java.util.concurrent 用户指南 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台&#xff0c;java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前&#x…

JavaScript实现四则运算

编写一个带有两个变量和一个运算符的函数&#xff0c;调用时接收prompt输入 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.or…