Java、Intellij : Replacing numeric overflow expression with one which doesn't overflow

标签 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();
            }
        }
    }

谢谢。

最佳答案

问题在于您的表达式 (1000 * 60 * 60 * 24 * 30) (结果为 2.592.000.000)是一个纯 int 溢出计算( Integer.MAX_VALUE 为 2.147.483.647)。

只需制作例如通过添加 L 将第一个数字变为 long:

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

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

关于Java、Intellij : Replacing numeric overflow expression with one which doesn't overflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39269958/

相关文章:

Java Restful Web 服务器。发送 Excel 工作表作为响应,其中包含 2 个附加变量

windows-mobile - 如何通过 wi-fi 在两台袖珍电脑之间发送文件?

Java正则表达式匹配结束不起作用

java - 幸存者空间达到 100% 满的原因是什么

java - 无法解析 YouTubeAndroidPlayerApi 依赖项

java - 如何在新进程中执行Jar文件并关闭原来的Jar?

java - 为什么我在 Spring 实例化的组件中找到静态字段?

java - 如何根据字符串的组合删除重复项?

java - Liquibase XML 生成器

java - 在 Java 中使用 Semaphore 和 Monitor 出现 IllegalMonitorException