在Java编码中,我们很容易犯一些错误,忽视一些问题。因此,笔者总结了一些日常编码中遇到的经典情况,并写在了一起。讨论。1、同名纠结现象。许多类具有相同的名称(例如:常见于异常、常量、日志等),这导致在导入时有时会出现模棱两可的错误。有时这种错误非常隐蔽。因为同名的类往往功能相似,所以IDE不会提示warn。写完代码,扫一扫导入部分,看看有没有不熟悉的地方。替换为正确的import后,注意注释是否也进行了相应的修改。启示录命名要尽量避免重名,尤其要避免和JDK中的类重名,否则容易导入错误,而且同名类较多,查找时更费时间区分.2.想当然的API现象有时候在调用API的时候,会想当然的直接通过名字信心满满的调用,导致一些让人吃惊的错误:例1:标志是否为真?布尔标志=Boolean.getBoolean("true");可能永远是假的。例2:这是去年的今天吗(今年是2012年,不考虑闰年)?结果还是2012年:Calendarcalendar=GregorianCalendar.getInstance();calendar.roll(Calendar.DAY_OF_YEAR,-365);以下是去年的:calendar.add(Calendar.DAY_OF_YEAR,-365);解决办法就是问自己几个问题,这个方法我熟悉吗?有类似的API吗?有什么不同?就示例1而言,区别如下:Boolean.valueOf(b)VSBoolean.parseBoolean(b)VSBoolean.getBoolean(b);名称应该更详细,注释应该更清楚。为了测试,使用一些API是理所当然的。如果时间有限,请使用您最熟悉的API。3.有时溢出并不困难。有时溢出并不难,尽管它不常被重现:示例1:longx=Integer.MAX_VALUE+1;System.out.println(x);什么是x?原来是-2147483648,加1后还在long范围内。时间计算中经常出现类似的东西:数1×数2×数3...例2:在检查是否为正数的参数校验中,为了避免重载,选择了参数数,所以结果下面代码中的小于0,也是因为Overflow导致:Numberi=Long.MAX_VALUE;System.out.println(i.intValue()>0);解决让最后一个操作数为long类型,比如加L或l(不推荐小写字母l,因为它和数字1太像了);当你不确定时,使用重载,即使你使用doubleValue(),当参数是一个BigDecimal参数时,也不能解决问题。启示对数字的使用敏感:当涉及到数字计算时,需要考虑溢出;涉及除法时,需要考虑被除数为0;容不下的话可以考虑BigDecimal之类的。#p#4。日志在哪里?现象有时候感觉日志已经打完了,为什么找不到呢?示例1:没有堆栈跟踪!}catch(Exceptionex){log.error(ex);}示例2:找不到日志!}catch(ConfigurationExceptione){e.printStackTrace();}解决方法换成log.error(ex.getMessage(),ex);将其更改为普通的log4j而不是System.out。EnlightenmentAPI定义应该防止人们犯错误。如果再加上重载的log.error(Exception),产品代码自然不会出现错误。使用的一些方法应该考虑是否有效。使用e.printStackTrace()考虑终端(控制台在哪里)。5.忘记Volatile现象在DCL模式下,总是忘记加一个Volatile。私有静态CacheImpl实例;//失去volatilepublicstaticCacheImplgetInstance(){if(instance==null){synchronized(CacheImpl.class){if(instance==null){instance=newCacheImpl();}}}returninstance;}解决方案没有疑问,我们加一个,synchronized锁住一段代码(整个方法或者某个代码块),保证了这“块”代码的可见性和原子性,但是instance==null***在第一次判断的时候已经不在范围内了。因此可以读取过期的空值。启示我们总觉得有些小概率事件是很难发生的,比如某个时刻有可能并发,有可能抛出某个异常,所以我们不去控制,但是如果有可能,就遵循以前的“**实践”写代码。至少不需要过多解释为什么换一种方式。6.互不影响。当释放多个IO资源时,会抛出IOException,为了方便可以这样写:publicstaticvoidinputToOutput(InputStreamis,OutputStreamos,booleanisClose)throwsIOException{BufferedInputStreambis=newBufferedInputStream(is,1024);BufferedOutputStreambos=newBufferedOutputStream(os,1024);……如果(isClose){bos.close();二.关闭();}}假设bos关闭失败,bis还能关闭吗?当然不是!解决办法是,虽然抛出的是同一个异常,但是最好分别捕获每一个。否则前者失败,后者就没有释放资源的机会。揭示出代码/模块之间可能存在依赖关系,必须充分识别相互依赖关系。#p#7。用断言代替参数校验现象如题中所述,是防御性编程常用的一种方式:断言,写在产品代码中进行参数校验等。例如:privatevoidsend(List
