Code Review
1.代码比较
IDEA --> git --> compare with branch --> master 对比
2.字符串判断
String str = “” ;
str == null 改为 StringUtil.isBlank
因为存在 str = “” 的情况
3.注意容易混淆的概念
userId / sellerId / shopId /
4.集合元素移除
List<Integer> integerList = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8));
integerList.remove((Object)1); // 删除元素1
integerList.remove(1); // 删除下标为1的元素
5.if()判断中包含大量的 || 与 & ,容易判断出错
建议拆分为多个子判断
&& 比 || 优先级高,用()将独立的判断包含起来
6.RPC 接口调用
try catch 异常捕获处理
重点是异常处理,避免因服务调用是吧,导致当前系统出现问题
7.工具类使用
NumberUtil 比较Number类型数据
StringUtil
MapUtil
Object.equals(常量,变量); // 常量在前
8.集合遍历前一定要判断
List<Integer> list = new ArrayList<>();
for(Integer inte : list){
System.out.println(inte);
}
list = null ;
for(Integer inte : list){ // 此处报空指针
System.out.println(inte);
}
// for 循环
/**
* Returns an iterator over the elements in this list in proper sequence.
*
* <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
*
* @return an iterator over the elements in this list in proper sequence
*/
public Iterator<E> iterator() {
return new Itr(); // 如果集合为空,此处报空指针
}
/**
* An optimized version of AbstractList.Itr
*/
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size; // for 循环实质调用此处
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
}
9.代码中的常量、字面量
提取到一个 Constant类中,写明备注;哪怕只是一个临时变量
不便于后续代码维护
持久使用且有多个数值的变量,建议建立枚举类
10.枚举类
构造方法不需 private 修饰,enum 类型的构造方法默认为私有的
11.日志打印
log.info("{}",e);
打印 e 不需要占位符,从源码中可以得出,当判断为 Throwable 时,不进行 format 处理
多个参数时建议将 e 放在最后
log.info("{},{}",e,1) ;
// 此时异常堆栈信息,不打印调用流程,只输出异常名称
如:
@RequestMapping(value = "error", method = RequestMethod.GET) @ResponseBody public Result<String> error() { try { int result = 0 / 0 ; log.info("error try :{}",result); }catch (Exception e){ log.error("error catch 1 :{}",e); // 输出e,但占位符没有替换 log.error("error catch 2 ",e); // 直接打印 log.error("error catch 3 param:{} ,{}",1,e); log.error("error catch 4 param:{}",1,e); // 格式化时源码中只处理了 字符串部分与字符串替换,且 Throwalbe 对象都在参数最后 log.error("error catch 5 param:{},{}",e,1); // error catch 5 param:java.lang.ArithmeticException: / by zero,1 log.error("error catch 6 param:{}",e,1); // error catch 6 param:java.lang.ArithmeticException: / by zero } return Result.wrapSuccessfulResult(1+""); }
第六种情况
ava.lang.ArithmeticException: / by zero 没有打印异常的堆栈信息