更多 Java 基础知识方面的文章,请参见文集《Java 基础知识》
摘要: 阿里巴巴集团推出的《阿里巴巴Java开发手册(正式版)》是阿里巴巴近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举如何开发更加高效、更加容错、更加有协作性,力求知其然,更知其不然,结合正反例,让Java开发者能够提升协作效率、提高代码质量。
作为一个 Java 开发人员,我花了一天时间阅读了这个开发手册,摘要了一些对于我有用的知识点。记录如下,仅供参考。
1. 异常处理
- 不要捕获 Java 类库中定义的继承自
RuntimeException
的运行时异常类,如:IndexOutOfBoundsException
/NullPointerException
,这类异常由程序员预检查来规避,保证程序健壮性。
- 捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
- 不能在
finally
块中使用return
,finally
块中的return
返回后方法结束执行,不会再执行try
块中的return
语句。 - 防止 NPE,是程序员的基本修养,注意 NPE 产生的场景:
1) 返回类型为包装数据类型,有可能是null
,返回int
值时注意判空。
反例:public int f(){ return Integer 对象};
如果为null
,自动解箱抛 NPE。
2) 数据库的查询结果可能为null
。
3) 集合里的元素即使isNotEmpty
,取出的数据元素也可能为null
。
4) 远程调用返回对象,一律要求进行 NPE 判断。
5) 对于 Session 中获取的数据,建议 NPE 检查,避免空指针。
6) 级联调用obj.getA().getB().getC();
一连串调用,易产生 NPE。 - 定义时区分 unchecked / checked 异常,避免直接使用
RuntimeException
抛出,更不允许抛出Exception
或者Throwable
,应使用有业务含义的自定义异常。
2.日志规约
- 应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);
- 异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么往上抛。
- 谨慎地记录日志。生产环境禁止输出 debug 日志;有选择地输出 info 日志;如果使用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。