A goto оператор в C и его аналоги сопровождаются аргументом Label .В определенном методе оператор goto label;
запустит процедуру, выполняющую метку.Ниже приведен пример, продемонстрированный Грегом Роджерсом в этой публикации .
void foo()
{
if (!doA())
goto exit;
if (!doB())
goto cleanupA;
if (!doC())
goto cleanupB;
// everything succeed
return;
cleanupB:
undoB();
cleanupA:
undoA();
exit:
return;
}
A goto
может быть очень эффективным инструментом в 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
}
}
Пакет com.sun.org.apache.bcel.internal.generic.GOTO
, я не использовал его лично, но я думаю, что он может помочь в достижении той же структуры кода, что продемонстрировал Грег Роджерс, например:
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;}