查看: 2067|回复: 25

Java编码易疏忽的十个问题

[复制链接]
发表于 2012-11-29 02:16:26 | 显示全部楼层 |阅读模式
在Java编码中,我们容易犯一些错误,也容易疏忽一些问题,因此笔者对日常编码中曾遇到的一些经典情形归纳整理成文,以共同探讨。  1、纠结的同名
  现象
  很多类的命名相同(例如:常见于异常、常量、日志等类),导致在import时,有时候张冠李戴,这种错误有时候很隐蔽。因为往往同名的类功能也类似,所以IDE不会提示warn。
  解决
  写完代码时,扫视下import部分,看看有没有不熟悉的。替换成正确导入后,要注意下注释是否也作相应修改。
  启示
  命名尽量避开重复名,特别要避开与JDK中的类重名,否则容易导入错,同时存在大量重名类,在查找时,也需要更多的辨别时间。
  2、想当然的API
  现象
  有时候调用API时,会想当然的通过名字直接自信满满地调用,导致很惊讶的一些错误:
  示例一:flag是true?
boolean flag = Boolean.getBoolean("true");

  可能老是false。
  示例二:这是去年的今天吗(今年是2012年,不考虑闰年)?结果还是2012年:
Calendar calendar = GregorianCalendar.getInstance();
calendar.roll(Calendar.DAY_OF_YEAR, -365);

  下面的才是去年:
calendar.add(Calendar.DAY_OF_YEAR, -365);

  解决办法
  问自己几个问题,这个方法我很熟悉吗?有没有类似的API? 区别是什么?就示例一而言,需要区别的如下:
Boolean.valueOf(b) VS Boolean.parseBoolean(b) VS Boolean.getBoolean(b);

  启示
  名字起的更详细点,注释更清楚点,不要不经了解、测试就想当然的用一些API,如果时间有限,用自己最为熟悉的API。
  3、有时候溢出并不难
  现象
  有时候溢出并不难,虽然不常复现:
  示例一:
long x=Integer.MAX_VALUE+1;
System.out.println(x);

  x是多少?竟然是-2147483648,明明加上1之后还是long的范围。类似的经常出现在时间计算:
数字1×数字2×数字3…

  示例二:
  在检查是否为正数的参数校验中,为了避免重载,选用参数number, 于是下面代码结果小于0,也是因为溢出导致:
Number i=Long.MAX_VALUE;
System.out.println(i.intValue()>0);

  解决
  1、让第一个操作数是long型,例如加上L或者l(不建议小写字母l,因为和数字1太相似了);
  2、不确定时,还是使用重载吧,即使用doubleValue(),当参数是BigDecimal参数时,也不能解决问题。
  启示
  对数字运用要保持敏感:涉及数字计算就要考虑溢出;涉及除法就要考虑被除数是0;实在容纳不下了可以考虑BigDecimal之类。
  4、日志跑哪了?
  现象
  有时候觉得log都打了,怎么找不到?
  示例一:没有stack trace!
} catch (Exception ex) {
    log.error(ex);
}



示例二:找不到log!
} catch (ConfigurationException e) {
    e.printStackTrace();
}

  解决
  1、替换成log.error(ex.getMessage(),ex);
  2、换成普通的log4j吧,而不是System.out。
  启示
  1、API定义应该避免让人犯错,如果多加个重载的log.error(Exception)自然没有错误发生
  2、在产品代码中,使用的一些方法要考虑是否有效,使用e.printStackTrace()要想下终端(Console)在哪。
发表于 2012-11-29 06:24:59 | 显示全部楼层
哈哈,顶你了哦.  
发表于 2012-12-4 16:46:48 | 显示全部楼层
哈哈,这么多的人都回了,我敢不回吗?赶快回一个,很好的,我喜欢  
发表于 2012-12-6 04:58:53 | 显示全部楼层
活着,以死的姿态……  
发表于 2012-12-9 18:50:06 | 显示全部楼层
彪悍的人生不需要解释。  
发表于 2012-12-13 06:21:50 | 显示全部楼层
照你这么说真的有道理哦 呵呵 不进沙子馁~~~  
发表于 2014-12-4 04:18:29 | 显示全部楼层
太棒了!  
发表于 2014-12-26 18:37:52 | 显示全部楼层
活着,以死的姿态……  
发表于 2015-1-27 00:04:18 | 显示全部楼层
先顶后看  
发表于 2015-2-28 22:47:26 | 显示全部楼层
dddddddddddddd  
高级模式
B Color Image Link Quote Code Smilies

本版积分规则