异常处理
1.Java类库中定义的一类RuntimeException可以通过预先检查进行规避,不应该通过catch来处理比如数组下表越界,空指针等
2.异常不要用来做流程控制,条件控制,因为异常处理的效率比条件分支低
3.try-catch操作包裹的代码应尽可能的排除稳定代码
4.finally对象必须对资源对象,流对象进行关闭,在JDK7以上使用try-with-resources方式
public class TryWithResource {
public static void main(String[] args) {
try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")))) {
int b;
while ((b = bin.read()) != -1) {
bout.write(b);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
5.不能在finally块中使用return,finally块中的return返回后方法执行结束,不会再执行try块中的return语句
6.捕获异常与抛出异常必须完全匹配,或者捕获异常是抛异常的父类
7.方法的返回值可以为NULL,不强制返回空集合,空对象等,必须注释充分说明什么情况下会返回null值,调用方需要进行null判断防止空指针问题
8.空指针产生的可能场景:
- 返回类型为基本数据类型,return的时候是包装类型对象,自动拆卸有可能产生NPE
- 数据库的查询结果可能为null
- 集合里的元素即使不为null,取出的数据元素也可能为null
- 远程调用返回对象,一律要求进行空指针判断
- 对于Session中获取的数据,需要进行检查
- 级联调用的情况下,容易产生NPE,例如obj.getA().getB()
9.定义时区的时候区分uncheck与check异常,避免直接抛出运行时异常
10.对于公司外的http/api开放接口应使用错误码,对于应用内部应抛出异常
日志
1.应用中不可直接使用日志系统中(log4j,logback)的API,而应该以来日志框架SLF4J中的API
2.日志文件应至少保存15天,因为有些异常以周为频次发生
3.在log4j.xml中设置additivity=false避免重复打印日志
4.日志的级别详情如下:
5.日志的打印应该使用占位符而不是使用+拼接字符串
6.关于异常的信息应包含两部分:案发现场信息与异常堆栈信息