bug小结

1.bug地址:ResultUtil line40
private static final String EXCEPTION_LOG_TPL = "serviceName: [%s] code: %d  error: %s exception: %s";
log.error(String.format(EXCEPTION_LOG_TPL, serviceName, e.getMessage(), e.getClass()));


错误原因:Argument of type String can't be handled by format specifier %d


后果:不能打印日志


正确结果:log.error(String.format(EXCEPTION_LOG_TPL, serviceName, StateEnum.INNER_ERROR.getState(), e.getClass(),e.getMessage()));


2.bug地址:所有继承于BaseDTO的DTO
错误原因:equals method overrides equals in superclass and may not be symmetric,也就是说父子类同时重写了equals方法,这个项目
使用了lombok来简化开发,提高可读性,而lombok插件会生成equals方法,而这些类都继承了同样使用lombok注解的BaseDTO,我查询了下
lombok编译后生成的equals代码:
   public boolean equals(Object o) {
       if(o == this) {
           return true;
       } else if(!(o instanceof ActivateStockedUserDTO)) {
           return false;
       } else {
        。。。
               return true;
           }
       }
   }    
    它使用instanceof进行比较这就带来一个问题,当使用多态时,你调用父类的equals方法与子类进行比较,可能不会得到你预期的结果,举个例子:
    Employee e1 = new Employee("chenssy", 23);
    Person p1 = new Person("chenssy");
    System.out.println(p1.equals(e1));
    结果应该为false,却得到了true。
    故在覆写equals时推荐使用getClass进行类型判断。而不是使用instanceof。
后果:目前没有影响,没有用到equals方法。如果以后有用到equals的地方要注意,推荐使用getClass进行类型判断
正确结果:无


3.bug地址:所有含有内部类的DTO
错误原因:Non-transient non-serializable instance field in serializable class
也就是说外部类用到了序列化,而内部类没用
后果:没有影响,我看了一下新网给的方法里面是以UrlEncodedFormEntity的一组一组键值对形式去发送的,而每个具体的BasicNameValuePair
都显示声明了序列化,而我们的DTO不涉及到传递,所以不需要序列化,当然实现了也无妨,但是如果真的涉及对象在网络上传递且含有内
部类,那么内部类也要含有serialVersionUID
正确结果:建议把serialVersionUID去掉,看着碍眼


4.bug地址:AppConfig loadPropertiesFromSrc
BufferedReader bf = new BufferedReader(new InputStreamReader(
in, "utf-8"));
错误原因:Method may fail to close stream 只关闭内层流,没关闭外层流
后果:浪费内存
正确结果:直接关闭外层


5.bug地址: Appconfig loadPropertiesFromSrc
if (!StringUtils.isEmpty(value)) {
this.connectionTimeout = Integer.valueOf(value.trim());
}
错误原因:Boxing/unboxing to parse a primitive,其实也不能算是一个错误 Integer.valueOf(string)
需要创建一个Integer对象,而Integer还有一个parseInt静态方法,不需要创建一个Integer,查看valueOf源码
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
发现Integer内部其实就是调用了parseInt方法,所以以后使用不建议用Integer.valueOf,而是使用parseInt
后果:浪费资源
正确结果:this.connectionTimeout = Integer.parseInt(value.trim());


6.bug地址: 所有包含内部类的DTO
错误原因:Should be a static inner class 这个。。。找了好久,没有找到说服我的理由,大家如果找到了可以教教我。
普通内部类和静态内部类区别:
(1)静态内部类不持有外部类的引用
(2)静态内部类不依赖外部类
(3)普通内部类不能声明static的方法和变量
没有使用说静态内部类有明显好处啊???
正确结果:无!


7.bug地址: Configs
properties.load(Configs.class.getResourceAsStream("/properties.properties"));
错误原因: () may fail to clean up java.io.InputStream 说白了就是没关流
后果:浪费内存
正确结果:
  InputStream in = Configs.class.getResourceAsStream("/properties.properties")
properties.load(in);
in.close();


8.bug地址: LogService
错误原因:Exception is caught when Exception is not thrown
 try {
   ...
 } catch (RuntimeException e) {
   throw e;
 } catch (Exception e) {
   ... deal with all non-runtime exceptions ...
 }
后果:有些提示不能显示期望的结果
正确结果:道理我都懂,但是不改了,对我们没有影响





你可能感兴趣的:(JAVA学习笔记总结)