不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。

无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行了应用和推广,收效颇丰,也总结了适合支付平台的技术规范,由于阿里巴巴Java开发手册本身定位为规约和规范,语言简单、精炼,没有太多的解读和示例,有些条款对于一般开发人员理解起来比较困难,本文借着阿里巴巴发布的Java开发手册,详细解读Java平台下开发规范和标准的制定和实施,强调那些在开发过程中需要重点关注的技术点,特别是解决某类已识别问题的模式和反模式。

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

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

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

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

白话:
    
判空是一个永恒的话题,只要你不确定变量是否为空,都应该判空,否则后患无穷。 
---------------------------------------------------------------------------------------------------------------
【强制】异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。

白话:
    
禁止使用异常来封装业务逻辑,业务异常应该用错误码来表示,系统异常则使用Java原生异常。

异常处理是通过异常表查询来实现的,肯定没有跳转语句性能高。
---------------------------------------------------------------------------------------------------------------
【强制】对大段代码进行 try-catch,这是不负责任的表现。catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。

白话:
    
做事要直切主题,不能一概而论。

不能简单的catch Throwable,然后打印日志,这是不负责任的表现,应该有针对的抓住和处理异常。
---------------------------------------------------------------------------------------------------------------
【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请 将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。

白话:    

禁止吃掉异常,吃掉异常就是捕获异常什么都没做,也没抛出,这也是不负责任的表现。

是在不能处理的异常抛出去,但是得让使用方知道这种情况,这是编程提供方契约的一种方式。
---------------------------------------------------------------------------------------------------------------
【强制】有 try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。

白话:我们基本采用声明式事务,出现异常需要回滚的情况,建议继续抛出异常让声明式事务自动回滚,不建议代码中手工控制事务。
---------------------------------------------------------------------------------------------------------------
【强制】finally 块必须对资源对象、流对象进行关闭,有异常也要做 try-catch。 说明:如果 JDK7 及以上,可以使用 try-with-resources 方式。

白话:永恒的资源关闭原则。

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

白话:
   
确实会覆盖try块里面的return语句。
    
思维不混乱的话,没人会把return语句写在finally语句里。
---------------------------------------------------------------------------------------------------------------
【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。

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

白话:异常处理后,让异常变得更小,而不是变大,大而化小,小而化了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐