20

使用 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 中的一个缓存问题...如果我知道复制/粘贴上面的内容,我不会收到警告。如果我在粘贴 1 次或 2 次后尝试编辑它,我会弹出警告。

4

2 回答 2

10

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

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

于 2016-02-08T10:51:21.730 回答
2

在 java 中,任何用字面量编写的数字都默认被视为整数。

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

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

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

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

long upper = lower + (1000L*60*60*24*365L); 
于 2021-03-11T11:47:47.377 回答