2016-07-27 4 views
12

私は、再現可能なテストケースがあります:Javaの8、更新51(OracleのJDK)を使用してなぜ明示的な戻りで空のラムダとコンストラクタは、コンパイラエラー(Javaのバグ?)を起こすん

public class TestCase { 

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

    public TestCase() { 
     return; 
    } 

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

を。これは、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のバグですか、ここでは紛失している言語の設計がありますか?

編集:これはHow can a constructor return a valueの複製ではなく、実際にはコンストラクタであり、コンストラクタの戻り値ではなく変数の初期化ではありません。

+0

[Javaの?:コンストラクタが値を返すことができる方法]の可能性のある重複(http://stackoverflow.com/questions/2574276/java-how-can-a-constructor-return-a-value) –

+4

なぜあなたはコンストラクタから 'return'を返しますか? –

+0

@ElliottFrischこれは、System#exitを呼び出すとすぐにコンストラクターが終了するはずだった、別の問題から非常に疲れた再現可能な例です。 – Rogue

答えて

12

公式のバグレポートhereがあります。問題は、Javaで固定されている9


You can return inside a constructor

リターンを返すメソッドの呼び出し元に制御を声明(§8.4、 15.12)またはコンストラクタ(§8.8、15.9) 。

+1

のように見えます。それはわかっているようですが、少なくとも私はoracleで大量のバグレポートを書く必要はありません。わーい! – Rogue

関連する問題