Почему возникает предупреждение "Числовое переполнение в выражении"
Использование 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);