为什么会出现 "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);
使用 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);