Java什么是双下划线符号?

klo*_*onq 9 java syntax notation

我正在浏览网页并找到了这个例子.在public static void main方法中,这是我以前从未见过的行语法__main:

如:

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

我尝试将其打入eclipse并使用工具提示获得一个黄色下划线,其中说"标签__main从未明确引用".

我在网上找不到任何东西,我真的很好奇!我已经用Java编程多年了,我以前从未见过这种语法.它做了什么,你为什么要使用它,我在哪里可以学到更多?

And*_*s_D 11

这是一个标签.您可以将它与breakcontinue语句一起使用.没有必要使用双下划线.


更确切地说:它是标记声明(JLS 14.7)的(第一部分):

Identifier : Statement
Run Code Online (Sandbox Code Playgroud)


Joa*_*uer 5

Java 中的双下划线没有语义(就像单下划线没有任何语义一样)。

它们可能具有的唯一含义取决于一些定义它们用途的命名约定。

看起来您查看的代码使用双下划线作为标签。由于标签在 Java 中不经常使用,我不会太担心。


Bit*_*map 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;
}
Run Code Online (Sandbox Code Playgroud)

Agoto在 Java 中可能是一个非常有效的工具,但 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
    }
}
Run Code Online (Sandbox Code Playgroud)

该包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;}
Run Code Online (Sandbox Code Playgroud)