Почему возникает предупреждение "Числовое переполнение в выражении"

Использование 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 теперь выдает предупреждение "Числовое переполнение в выражении". Я бы понял, если бы это было на самом деле так, и он последовательно предупреждал оба выражения, но это не так.

Кто-нибудь знает, почему 2-е выражение генерирует предупреждение? Я предпочел бы разбить этот путь, а не число, потому что другим разработчикам проекта легче понять, что он делает (хотя, я полагаю, я мог бы прокомментировать). Код по-прежнему компилируется, но в моих сборках я нахожу предупреждения, как зуд, который я не могу поцарапать.

РЕДАКТИРОВАТЬ Спасибо за ответы... Я думаю, что это просто проблема с кэшированием в Intellij... Если я знаю скопировать / вставить выше, я не получаю предупреждение. Если я пытаюсь редактировать его после вставки 1 или 2 раза из 10, я получаю предупреждение.

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 upper = lower + (1000L*60*60*24*365L); 
Другие вопросы по тегам