10

私はウェブを閲覧していて、この例を見つけました。public static void main メソッド内には、これまでに見たことのないこの行の構文があります__main:

次のように:

public class Klass {
    public static void main(String[] args) {
        // code goes here...
__main:
        // and mode code here...
    }
}

これをEclipseに打ち込んでみましたが、「ラベル__mainは明示的に参照されることはありません」というツールチップで小さな黄色の下線が引かれました。

私はオンラインで何も見つけることができず、私は本当に興味があります! 私は何年も Java でプログラミングしてきましたが、この構文は初めて見ました。それは何をしますか、なぜそれを使用しますか、どこで詳細を知ることができますか?

4

8 に答える 8

12

それがラベルです。breakandcontinueステートメントで使用できます。2 つのアンダースコアを使用する必要はありません。


より正確に言うと、ラベル付きステートメント( JLS 14.7 )の (最初の) 部分です。

Identifier : Statement
于 2011-09-14T08:25:48.547 に答える
5

Java の 2 つのアンダースコアには意味的な意味がありません (1 つのアンダースコアに意味的な意味がないのと同じです)。

それらが持つことができる唯一の意味は、それらが何のために使用されるかを定義するいくつかの命名規則に依存します.

あなたが見ているコードは、ラベルに二重のアンダースコアを使用しているようです。ラベルは Java ではあまり使用されないため、あまり気にする必要はありません。

于 2011-09-14T08:25:16.143 に答える
2

ただのラベルです。と書くこともできますがbla:、同じ効果があります。

ラベルは一般的にgotoステートメントで使用されますが、私の知る限りgoto、Java では禁止されています (他の高水準言語では非常に推奨されていません)。

ただし、これは、continueand を使用してループ内で使用することもできますbreak。たとえばcontinue someLabel;、現在のループではなく、外側のループを継続または中断で参照する場合です。

于 2011-09-14T08:26:08.353 に答える
2

二重下線は無関係です。あなたは本当にラベルについて尋ねています。ここにいくつかの情報があります。基本的には、ブレークを制御するために使用されます。また、インタビューでの楽しいトリビアの質問: 次のコードはコンパイルされますか?

public void doSomething(){
   http://www.stackoverflow.com
}

なぜそうなのか、そして今、あなたはその理由を知っています:D

于 2011-09-14T08:28:01.270 に答える
2

Java にはラベルがあります (ただし goto はありません)。二重アンダースコアには意味はありませんが、有効な Java 識別子です。

JLS から:

14.7 ラベル付きステートメント ステートメントには、ラベル接頭辞が付いている場合があります。

LabeledStatement:
  Identifier : Statement

LabeledStatementNoShortIf:
  Identifier : StatementNoShortIf

識別子は、すぐに含まれるステートメントのラベルであると宣言されます。

C や C++ とは異なり、Java プログラミング言語には goto ステートメントがありません。識別子ステートメント ラベルは、ラベル付きステートメント内の任意の場所に表示される break (§14.14) または continue (§14.15) ステートメントと共に使用されます。

ラベル付きステートメントによって宣言されたラベルの有効範囲は、ラベル付きステートメントに直接囲まれたステートメントです。

于 2011-09-14T08:28:08.553 に答える
2

Cのgotoステートメントとそれに相当するステートメントには、 Label引数が伴います。定義されたメソッドでは、goto label;ステートメントはラベルの前にあるルーチンを起動します。以下は、この投稿で Greg Rogers が示した例です。

void foo()
{
    if (!doA())
        goto exit;
    if (!doB())
        goto cleanupA;
    if (!doC())
        goto cleanupB;

    // everything succeed
    return;

cleanupB:
    undoB();
cleanupA:
    undoA();
exit:
    return;
}

は Java で非常に効果的なgotoツールになる可能性がありますが、キーワードが言語によって予約されている場合でも、Java はgotoキーワードを明示的にサポートしていません。breakステートメントを使用すると、コマンドがラベルから飛び出して、ラベルの後のステートメントに進むことができます。

例:

public class Klass {
  public static void main(String[] args) {
  // code goes here...
  __main:
        {
         if(args.length==0)
         {
          break __main;
         }
        }
  //code after label
    }
}

パッケージcom.sun.org.apache.bcel.internal.generic.GOTO、私は個人的には使用していませんが、次のように Greg Rogers が示したのと同じコード構造を実現するのに役立つと思います。

 void foo()
  {
      if (!doA())
          GOTO exit;
      if (!doB())
          GOTO cleanupA;
      if (!doC())
          GOTO cleanupB;

      // everything succeed
      return;

  cleanupB:
      undoB();
  cleanupA:
      undoA();
  exit:
      return;
  }

  void undoB(){}
  void undoA(){}
  boolean doC(){return false;}
  boolean doA(){return false;}
  boolean doB(){return false;}
于 2011-09-14T08:47:51.607 に答える
1

あなたが実際に尋ねたことに誰も正確に答えていないようです(しかし、「goto」の答えはおそらくあなたが本当に探していたものです)。

二重下線は通常、システム内で他の識別子との衝突の可能性を防ぐために使用されます...通常、ユーザーがスコープを使用できる場合に使用されます。この場合、アンダースコアがないと、ある時点で「メイン」変数を作成できなくなるか、システムクラスが main という単語を使用できなくなる可能性があります。

この場合、変数に「main」という名前が付けられていた場合、定義されている「public static void main」と競合すると思います。

要約すると、二重下線は手動スコープの一種だと思います..

于 2012-11-20T18:32:43.187 に答える
1

二重アンダースコアとラベルは、C でより多く使用される傾向があります。おそらく、開発者は最近 C を書いています。

ところで: ラベルがループに使用されることはめったにありませんが、スコープ外へのジャンプはさらにまれです。

scope: {
  // some code
  if (flag)
      break scope; // no loop
  // some more code
}

ラベルはまれであるため、役立つというよりは混乱を招く可能性があります。;)

于 2011-09-14T08:38:19.720 に答える