2017-03-28 2 views
18

私はJava構文で遊んでいるので、これは純粋に好奇心から生じる問題です。コードのこの作品:ラベル(http)が「文が続かなければならない」のでJava:ラベルの後の許可された文

http://www.google.com 
Object val = 5 <- 4; 

は、ないコンパイルを行います。次の二つの変異体は、コンパイルします:どちらの場合も

http://www.google.com 
{ Object val = 5 <- 4; } 

Object val; 
http://www.google.com 
val = 5 <- 4; 

を、私は式に宣言から切り替えます。 これは私が正確にJavaで「文」があるか疑問になりますが、doc 状態:宣言文と制御フロー文:式文に加えて

は、文の他の二つの種類があります。宣言文は変数を宣言します。

JLSだけ識別子がすぐに含まれるStatementのラベルとして宣言され

こと(ラベル上)と言います。

「表現文」については何も言及していません。

私は何かを見逃しましたか、これはちょうど不明瞭/間違った仕様ですか?

+0

「http://www.google.com」という表現は何ですか? –

+8

@MykhayloKopytonenkoこれは表現ではなく、コメントの一部のテキストです。ラベルは 'http:'で、 '//'は行コメントを開始します。トリッキーなトリッキー! :) – yshavit

+2

コードはナッツです! –

答えて

20

JLSの第14章を少し慎重に読んだ場合、LocalVariableDeclarationStatementはではなく、ステートメントになります。それほど直感的ではありませんか?

すなわち、JLS 14.2に、我々は参照:

  • ブロックが実質的にゼロ以上BlockStatements
  • から成るBlockStatementのいずれかである:
    • LocalVariableDeclarationStatement
    • ClassDeclaration
    • ステートメント

LocalVariableDeclarationStatementは、階層内のStatementの子孫ではなく、兄弟です。どちらもBlockStatementsのタイプです。

ラベルには真の文—、つまりLocalVariableDeclarationStatementでもClassDeclarationでもないBlockStatementの特定のサブタイプが続かなければなりません。 Statementのさまざまなサブタイプは、14.5にリストされています。 StatementWithoutTrailingSubstatementのサブタイプとしてExpressionStatementがありますが、その中にLocalVariableDeclarationStatementはありません。

+1

これは本当に非常に直感的な名前の選択です。引用されたセクションは、Java 8 [JLS 14.2](https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.2)でわずかに異なります(複数の表記法ステートメントが少し変わってArrayのような "[]"になり、リンクが追加されました)。 – Hulk

+0

関数本体がブロックステートメントなので、JLS 14.2が適用されます...ありがとうございます! – Moritz

関連する問題