2016-07-27 16 views
12

ich einen reproduzierbaren Testfall habe (Java Bug?):Warum ein leeres Lambda und Konstruktor mit einer expliziten Rückkehr eines Compiler-Fehler verursachen

public class TestCase { 

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

    public TestCase() { 
     return; 
    } 

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

mit Java 8 aktualisiert 51 (Oracle JDK). Dies kann nicht mit IntelliJ und javac kompiliert werden.

IntelliJ Ausgang:

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

Javac Ausgang:

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

Nun, was seltsam ist, ist, dass return; oder die Consumer Entfernen wird den Fehler beheben. Ist das ein Java-Bug oder gibt es etwas vom Sprachdesign, das mir hier fehlt?

Edit: Dies ist kein Duplikat von How can a constructor return a value, das ist eigentlich ein Konstruktor und ist nicht über den Rückgabewert des Konstruktors sondern Variable Initialisierung.

+0

Mögliche Duplikat [Java: Wie ein Konstruktor einen Wert zurückgeben kann] (http://stackoverflow.com/questions/2574276/java-how-can-a-constructor-return-a-value) –

+4

Warum kommst du von einem Konstruktor zurück? –

+0

@ElliottFrisch Dies ist ein sehr verwässertes, reproduzierbares Beispiel aus einem anderen Problem, bei dem der Konstruktor beim Aufruf von System # exit sofort beendet werden sollte. – Rogue

Antwort

12

Sie können einen offiziellen Fehlerbericht here finden. Das Problem wird in Java 9.


feste

You can return inside a constructor

eine return-Anweisung kehrt zum Aufrufer eines Verfahrens Steuerung (§8.4, §15.12) oder Konstruktor (§8.8, §15.9) .

+1

Scheint wie es bekannt ist, so dass ich zumindest keinen massiven Fehlerbericht über Orakel schreiben muss. Yay! – Rogue