阿里巴巴对Java编程【异常处理】的规约

转载自 阿里巴巴对Java编程【异常处理】的规约

异常处理



1. 【强制】 Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该通过 catch 来处理,比如: IndexOutOfBoundsException , NullPointerException 等等。

说明:无法通过预检查的异常除外,如在解析一个外部传来的字符串形式数字时,通过 catchNumberFormatException 来实现。

正例: if (obj != null) {...}

反例: try { obj.method() } catch (NullPointerException e) {...}


2. 【强制】异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。


3. 【强制】对大段代码进行 try - catch ,这是不负责任的表现。 catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。


4. 【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。


5. 【强制】有 try 块放到了事务代码中, catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。


6. 【强制】 finally 块必须对资源对象、流对象进行关闭,有异常也要做 try - catch 。

说明:如果 JDK 7 及以上,可以使用 try - with - resources 方式。


7. 【强制】不能在 finally 块中使用 return , finally 块中的 return 返回后方法结束执行,不会再执行 try 块中的 return 语句。


8. 【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。

说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。


9. 【推荐】方法的返回值可以为 null ,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回 null 值。调用方需要进行 null 判断防止 NPE 问题。

说明:本手册明确防止 NPE 是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、序列化失败、运行时异常等场景返回null 的情况。


10. 【推荐】防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景:

1 ) 返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。

反例: public int f()  {  return Integer 对象}, 如果为 null ,自动解箱抛 NPE 。

2 ) 数据库的查询结果可能为 null 。

3 ) 集合里的元素即使 isNotEmpty ,取出的数据元素也可能为 null 。

4 ) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE 。

5 ) 对于 Session 中获取的数据,建议 NPE 检查,避免空指针。

6 ) 级联调用 obj . getA() . getB() . getC(); 一连串调用,易产生 NPE 。

正例:使用 JDK8 的 Optional 类来防止 NPE 问题。


11. 【推荐】定义时区分 unchecked /  checked 异常,避免直接抛出 new RuntimeException() ,更不允许抛出 Exception 或者 Throwable ,应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常,如: DAOException /  ServiceException 等。


12. 【参考】在代码中使用“抛异常”还是“返回错误码”,对于公司外的 http / api 开放接口必须使用“错误码” ; 而应用内部推荐异常抛出 ; 跨应用间 RPC 调用优先考虑使用 Result 方式,封装 isSuccess()方法 、“错误码”、“错误简短信息”。

说明:关于 RPC 方法返回方式使用 Result 方式的理由:

1 ) 使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。

2 ) 如果不加栈信息,只是 new 自定义异常,加入自己的理解的 error message ,对于调用端解决问题的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输的性能损耗也是问题。


13. 【参考】避免出现重复的代码 (Don ’ t Repeat Yourself) ,即 DRY 原则。

说明:随意复制和粘贴代码,必然会导致代码的重复,在以后需要修改时,需要修改所有的副本,容易遗漏。必要时抽取共性方法,或者抽象公共类,甚至是组件化。

正例:一个类中有多个 public 方法,都需要进行数行相同的参数校验操作,这个时候请抽取:

private boolean checkParam(DTO dto) {...}


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

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

相关文章

Http协议的请求和响应

1.HTTP协议介绍 HTTP(HyperTextTransferProtocol):超文本传输协议。HTTP协议是基于TCP/IP协议的。基于请求/响应模型的: 一次请求对应一次响应。传输协议:客户端和服务器端的通信规则(握手规则)。 2.HTTP协议的请求 HTTP协议规定了客户端发给服务器的数…

centos上安装jdk

1)下载jdk: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2)放置到/usr/local/software/java 目录下,并解压 tar-xzv -f jdk*.gz 3)配置环境变量 vim /etc/profile 追…

阿里巴巴对Java编程【单元测试】的规约

转载自 阿里巴巴对Java编程【单元测试】的规约 单元测试 1. 【强制】好的单元测试必须遵守 AIR 原则。 说明:单元测试在线上运行时,感觉像空气 (AIR) 一样并不存在,但在测试质量的保障上,却是非常关键的。好…

linux-basic(7)linux文件与目录管理

【7.1】目录与路径 【7.1.2】目录相关操作1)特殊目录列表:(1)2)目录操作命令,底下我们就来谈一谈几个常见的处理目录的命令吧:cd:变换目录pwd:显示目前的目录mkdir:创建一个新的目录…

Get和Post请求和对应的参数获取

1.get和post的请求方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vue的异步请求</title><script src"js/vue.js"></script><!--vue单独抽取的插件--><sc…

阿里巴巴对Java编程【安全规约】的规约

转载自 阿里巴巴对Java编程【安全规约】的规约 安全规约 1. 【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。 说明&#xff1a;防止没有做水平权限校验就可随意访问、修改、删除别人的数据&#xff0c;比如查看他人的私信内容、修改他人的订单。 2. 【强制】用户敏…

JSON转换工具---jackson

1.json传递中和javaBean对象的关系 打印出来的字符串&#xff0c;对象和键值集合用{}, 数组和用[] 2.json的转换 总测试类:以下转换都为单元测试方法 public class ObjectMapperTest {private ObjectMapper mapper new ObjectMapper(); }<1>json和对象的转换 /*1.Use…

df、du和fdisk命令的区别

【1】df 列出文件系统的整体磁盘使用量由于 df 主要读取的数据几乎都是针对一整个文件系统&#xff0c;因此读取的范围主要是在 Superblock 内的信息&#xff0c; 所以这个命令显示结果的速度非常的快速&#xff01;&#xff08;1&#xff09;&#xff08;2&#xff09;补充&am…

阿里巴巴对Java编程【Mysql】的规约

转载自 阿里巴巴对Java编程【Mysql】的规约 建表规约 1. 【强制】表达是与否概念的字段&#xff0c;必须使用 is _ xxx 的方式命名&#xff0c;数据类型是 unsigned tinyint&#xff08; 1 表示是&#xff0c;0 表示否 &#xff09; 。 说明&#xff1a;任何字段如果为非负数&a…

applicationContext配置mybatis

1.引入外部的properties属性文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://w…

linux-basic(8)linux磁盘与文件系统管理

【8.1】认识EXT2文件系统【补充】硬盘与存储设备 https://blog.csdn.net/pacosonswjtu/article/details/79811762&#xff08;1&#xff09;实际的数据都是写在具有磁性物质的磁碟盘上头&#xff0c;而读写主要是透过在机械手臂上的读取头(head)来达成。 实际运作时&#xff0c…

阿里巴巴对Java编程【应用结构】的规约

转载自 阿里巴巴对Java编程【应用结构】的规约 应用分层 1. 【推荐】图中默认上层依赖于下层&#xff0c;箭头关系表示可直接依赖&#xff0c;如&#xff1a;开放接口层可以依赖于Web 层&#xff0c;也可以直接依赖于 Service 层&#xff0c;依此类推&#xff1a;  开放接口…

spring注解注入IOC

1.创建Bean对象的注解 <1>配置自定义Bean对象注解 Component、Controller、Service、repository 用法&#xff1a;写在类上&#xff0c; 例如&#xff1a;Service 或者 Service(“userService”) 作用&#xff1a;将该类交给Spring创建对象保存到Spring容器中&#xff…

jstack命令:教你如何排查多线程问题

转载自 jstack命令&#xff1a;教你如何排查多线程问题这是之前的一个死锁案例&#xff1a;一个多线程死锁案例&#xff0c;如何避免及解决死锁问题&#xff1f;如程序中发生这样的死锁问题该如何排查呢&#xff1f;我们可以使用java自带的jstack命令进行排查。1、先在服务器运…

linux-basic(9)文件与文件系统的压缩与打包

【9.1】压缩文件的用途与技术【9.2】linux系统常见的压缩命令1&#xff09;压缩文件的扩展名大多是 tar, tar.gz, tgz, gz, Z, bz2 等&#xff1b;如下图所示&#xff1a;&#xff08;1&#xff09;Linux上常见的压缩命令就是 gzip 与 bzip2 &#xff0c;至於 compress 已经不再…

纯注解开发配置spring

1.纯注解开发【定义配置类的注解】 Confituration 表示该类是一个配置类 ComponentScan(“com.itheima”) 配置包扫描 PropertySource(“classpath:jdbc.properties”) 加载属性文件 Import(JdbcConfig.class) 加载其他配置类 2.spring整合mybatis【纯注解&#xff0c;3个…

阿里巴巴对Java编程【命名风格】的规约

转载自 阿里巴巴对Java编程【命名风格】的规约 命名风格 1. 【强制】代码中的命名均不能以下划线或美元符号开始&#xff0c;也不能以下划线或美元符号结束。 反例&#xff1a; _name / __name / $Object / name_ / name$ / Object$ 2. 【强制】代码中的命名严禁使用拼音与英文…

linux-basic(10)vim程序编辑器

【10.1】vi 与 vim【10.2】vi的使用1&#xff09;3种模式&#xff1a;模式1&#xff1a;一般模式&#xff0c; vim打开就是这种模式&#xff0c;编辑模式下 按 esc 回到一般模式&#xff1b;模式2&#xff1a;编辑模式&#xff0c;要等到你按下『i, I, o, O, a, A, r, R』等任何…

阿里巴巴对Java编程【代码格式】的规约

转载自 阿里巴巴对Java编程【代码格式】的规约 代码格式 1. 【强制】大括号的使用约定。如果是大括号内为空&#xff0c;则简洁地写成{}即可&#xff0c;不需要换行 &#xff1b; 如果是非空代码块则&#xff1a; 1 &#xff09; 左大括号前不换行。 2 &#xff09; 左大括号后…

自定义通配器导入bean对象

1.CustomerImportSelector工具类&#xff1a; /*** description : 自动导入器* author : wanYunBo* date : 2021-09-02 20:46**/ package com.itheima.config.selector;import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import o…