Почему пустая лямбда и конструктор с явным возвратом вызывают ошибку компилятора (Java Bug?)

У меня есть воспроизводимый тестовый пример:

public class TestCase {

    private final java.util.function.Consumer<Object> emptyCallback = result -> {};

    public TestCase() {
        return;
    }

    public static void main(String... args) {
        new TestCase();
    }
}

Использование Java 8, обновление 51 (Oracle JDK). Это невозможно скомпилировать, используя как IntelliJ, так и javac.

Выход IntelliJ:

Error(6, 7): java: variable result might not have been initialized

Выход javac:

TestCase.java:6: error: Variable result might not have been initialized
        return;
        ^
1 error

Теперь странно, что удаление return; или Consumer исправляет ошибку. Является ли это ошибкой java, или есть что-то из языка, который я здесь отсутствует?

Изменить: это не дубликат Как конструктор может вернуть значение, это на самом деле конструктор и не относится к возвращаемому значению конструктора, но переменной инициализации.

Ответ 1

Вы можете найти официальный отчет об ошибке здесь. Проблема исправлена ​​в Java 9.


Вы можете return внутри конструктора

Возвращаемый оператор возвращает управление вызывающему методу (§8.4, § 15.12) или конструктор (§8.8, §15.9).