使用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次后编辑它,我会弹出警告。
答案 0 :(得分:10)
我刚刚在我的机器上试过这个。相同版本的intellij,但略高一点的java 1.8.0_66。如果我复制粘贴您的代码并假设较低的是很长的,我不会收到警告。如果我删除“L”,我会收到警告(显然)。如果我把“L”放回去,警告就不会消失。如果我关闭并重新打开IntelliJ,警告就会消失。
已添加到问题跟踪器:IDEA-151378
答案 1 :(得分:1)
任何以字面量书写的数字在 Java 中都被默认视为整数。
long upper = lower + (1000L*60*60*24*365);
这是整数横向计算以生成大于 Integer.MAX_VALUE 的值。因此,数值表达式溢出。
编译器期望 int * int = int 为避免此警告,您需要建议编译器将答案预期为 long 值。
如果上面的表达式写成这样,编译器不会给出警告:
long upper = lower + (1000L*60*60*24*365L);