前两天我的工程出现的一个问题,出现这个问题后我才知道自己的java基础是多么的烂,实在要为自己找个一点好听点借口就是多么的粗心.唉,感概一下,这是一个普通到不能再普通的问题了,进入正题……一块来看看这个低级失误... 有意思的是和Mian的DefaultIoFuture中的问题很像..
在项目中有这样一个需求:把一个新闻对象缓存到内存中,但是要求在每天清理掉过期的新闻对象。比如一个新闻我要求保存30天,那么在新闻的发布日期超过30天的时候,这个新闻会被删除掉。这个一个普通的不能再普通的需求,看看如下新闻对象.
public class News {
private long newsDateTime;
public long getNewsDateTime() {
return newsDateTime;
}
public void setNewsDateTime(long dateTime) {
this.newsDateTime = dateTime;
}
...
}
OK,接下来看看如何来判断这个新闻是否超过指定的时间.
long nowTime = System.currentTimeMillis();
long newsTime = news.getNewsDateTime();
int activeDays = Config.getActiveDays(); //从配置文件中获取需要保存多少天
long interval = activeDays * 24 * 60 * 60 * 1000; //计算出间隔时间
long t = nowTime - newsTime;
if(t > interval) {
System.out.println(news.getNewsID() + "可以被删除掉了.");
}
代码很简单,用当前时间减去新闻发布时候的时间得出结果后和配置文件中配置的需要保存多少天的时间进行比较,如果大于这个天数那么就删除新闻,否则什么也不做.
这段代码有个很大的问题,也很隐蔽.这也是我为什么把他贴出来的原因.如果配置文件是10天,20天,那么代码可以正常工作.如果是30天,几乎所有的新闻都会被删除掉.原因就在于activeDays * 24 * 60 * 60 * 1000这一句上,仔细想想,如果是整形那么30×24×60×60×1000必然变成负数了,所以后面的t > interval也就成立了.
以后这种运算千万要注意了.基础也罢粗心也罢,搞的人难堪至极...