Подтвердить что ты не робот

Является ли `1/0` постоянным выражением в Java?

Насколько я понимаю Java 8 JLS выражение (1/0) считается постоянным выражением, но когда я пытаюсь скомпилировать следующая программа с OpenJDK 8 Я получаю сообщение об ошибке

public class Switch {
    public static void main(String[] args) {
        switch(42) {
            case (1/0):
                return;
            default:
                return;
        }
    }
}

Ошибка говорит, что (1/0) не является постоянным выражением

Switch.java:4: error: constant expression required
            case (1/0):
                 ^
1 error

Я что-то упустил? Или это ошибка в OpenJDK 8?

4b9b3361

Ответ 1

Компилятор выполняет постоянную сворачивание (предварительно вычисляя тривиальные литералы). Это случай, когда выражение "завершается внезапно", чтобы использовать формулировку JLS, дисквалифицируя ее от определения "постоянного выражения". Так что это не ошибка, это согласуется с JLS.

И да, выражение не оценивает значение (предупреждение пользователю, пытающемуся сделать что-то подобное, что результат не будет постоянным выражением), но компилятор не знает этого, пока он не попытается. Не оценивая значение и завершая внезапно, похоже, идет рука об руку.

Добавление объявления переменной, например

int x = 1 / 0;

не вызывает ошибку компилятора, это переключатель, который заставляет выражение оцениваться во время компиляции.

Кстати, я проверил, что это происходит и для версии 7 Oracle и IBM JDK, но не для OpenJDK или JDK8.

Ответ 2

Постоянное выражение должно иметь возможность оценивать значение, поскольку компилятор должен свести это выражение к значению.

1/0 не имеет значения.

Из JSL §15.28:

Выражение константы времени компиляции представляет собой выражение , обозначающее значение примитивного типа или String, которое не завершается внезапно и составлено, используя только следующее: