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



Using 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 次(满分 10 次)后对其进行编辑,则会出现警告。

我刚刚在我的机器上尝试过这个。相同版本的 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 upper = lower + (1000L*60*60*24*365L); 

相关内容

最新更新