Java,Intellij:将数字溢出表达式替换为不溢出的表达式

时间:2016-09-01 11:09:41

标签: java

我有一个预定的工作,我想计算到最后30天的时间。为此,我收到一个警告,表明在表达式中检测到数字溢出。我怎样才能安全地给出30天?

@Override
    @Scheduled(cron = "0 5 5 * * ?")
    public void deleteRepliesAutomatically() {
        if(schedulerActive.equals("true")) {
            Session session = this.sessionFactory.getCurrentSession();
            long now = System.currentTimeMillis();
// Below line gives warning. 
            long nowMinus1Week = now - (1000 * 60 * 60 * 24 * 30);
            Timestamp nowMinus1WeekAsTimeStamp = new Timestamp(nowMinus1Week);
            Query query = session.createQuery("from Replies as cm where cm.sortTimeStamp <:limit");
            query.setParameter("limit", nowMinus1WeekAsTimeStamp);
            List<Replies> repliesList = query.list();
            for (Replies replies : repliesList) {
                session.delete(replies);
                session.flush();
            }
        }
    }

谢谢。

2 个答案:

答案 0 :(得分:5)

问题是你的表达式(1000 * 60 * 60 * 24 * 30)(导致2.592.000.000)是一个纯int - 计算溢出(Integer.MAX_VALUE是2.147.483.647)。

只需制作例如第一个数字为long,添加了L

(1000L * 60 * 60 * 24 * 30)

这将使用足以容纳该值的long数据类型进行整个计算。

答案 1 :(得分:4)

piet.t的答案是正确的,以解决手头的问题。

但是使用TimeUnit枚举从一个单元到另一个单元进行计算会更好。 例如,要有一周的毫秒数:

long millis = TimeUnit.DAYS.toMillis(7);

您还可以为DAYS执行静态导入。