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;}