为什么会出现“表达式中的数字溢出”警告

2022-09-02 04:42:21

使用 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 现在发出警告“表达式中的数字溢出”。如果这是真的,我会理解,并且它一直在警告两种表达,但事实并非如此。

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

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


答案 1

我刚刚在我的机器上尝试过这个。Intellij的相同版本,但Java 1.8.0_66略新。如果我复制粘贴您的代码并假设较低是很长,我不会收到警告。如果我删除“L”,我得到警告(显然)。如果我把“L”放回去,警告就不会消失。如果我关闭并重新打开IntelliJ,警告就会消失。

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


答案 2

在 java 中,任何用文本书写的数字都默认被视为整数。

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

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

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

如果上述表达式写为:

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

推荐