为什么会出现 "Numeric overflow in expression" 警告

Why "Numeric overflow in expression" warning occurs

使用 intellij 15.0.3 + Java 8u65...

lower = System.currentTimeMillis();
long upper = lower + 31536000000L; //add a year-ish

工作正常。但如果我这样做:

lower = System.currentTimeMillis();
long upper = lower + (1000L*60*60*24*365); 

Intellij 现在发出警告 "Numeric overflow in expression"。如果这是真的,我会理解,并且它一直在警告这两个表达式,但事实并非如此。

有人知道为什么第二个表达式会产生警告吗?我宁愿以这种方式进行细分而不是数字,因为项目的其他开发人员更容易理解它在做什么(尽管我想我可以发表评论)。代码显然仍然可以编译,但我在我的构建中发现警告就像我无法抓挠的痒一样。

编辑 感谢回复... 我认为这只是 Intellij 中的一个缓存问题...如果我知道 copy/paste 以上内容,我就不会收到警告。如果我尝试在粘贴后编辑它 10 次中的 1 次或 2 次,我会弹出警告。

我刚刚在我的机器上试过了。相同版本的 intellij,但稍新 java 1.8.0_66。如果我复制粘贴您的代码并假设 lower 是长的,我不会收到警告。如果我删除 "L" 我会收到警告(很明显)。如果我将 "L" 放回去,警告不会消失。如果我关闭并重新打开 IntelliJ,警告就会消失。

已添加到问题跟踪器:IDEA-151378

在java.

中,任何以文字形式书写的数字在默认情况下都被视为整数
long upper = lower + (1000L*60*60*24*365); 

这是整数横向计算生成大于Integer.MAX_VALUE的值。因此,数值表达式溢出。

编译器期望 int * int = int 以避免此警告,您需要建议编译器将答案预期为 long 值。

如果上面的表达式写成这样,编译器不会给出警告:

long upper = lower + (1000L*60*60*24*365L);