Има ли начин да се изпълни функция goto в Java?

Знам, че goto е ключова дума, която не се използва в Java. Мога ли да изпълня нещо подобно, като използвам етикет или друг начин за преминаване към различна част от кода?

    public static void main(String[] args) {
        for(int i=5; i>0; i--){
            System.out.println();

            first:
            for(int x=i; x<6; x++){
                System.out.print("*");
            }
        }
        System.out.println("print '*'");{
            break first;
        }
    }
}

person Varun Jain    schedule 10.08.2013    source източник
comment
Мисля, че трябва да обясните какво точно се опитвате да отпечатате, ще бъде по-лесно да намерите по-добро решение за това   -  person benzen    schedule 10.08.2013


Отговори (3)


Можете да използвате continue, за да преминете към различни етикети в кода като:

public class Label {
    public static void main(String[] args) {
        int temp = 0;
        out: // label
        for (int i = 0; i < 3; ++i) {
            System.out.println("I am here");
            for (int j = 0; j < 20; ++j) {
                if(temp==0) {
                    System.out.println("j: " + j);
                    if (j == 1) {
                        temp = j;
                        continue out; // goto label "out"
                    }
                }
            }
        }
        System.out.println("temp = " + temp);
    }
}

Резултатът:

I am here
j: 0
j: 1
I am here
I am here
temp = 1

Въпреки това няма да ви препоръчам да го правите. Има по-подредени начини да направите това, тъй като Джеймс Гослинг създаде оригиналната JVM с поддръжка на оператори goto, но след това той премахна тази функция като ненужна. Основната причина goto да е ненужен е, че обикновено може да бъде заменен с по-четливи изрази (като break/continue) или чрез извличане на част от код в метод.

Източник: Джеймс Гослинг, сесия с въпроси и отговори

person rahulserver    schedule 10.08.2013

Можете да направите това

first: {
  for(int i=5; i>0; i--){
    System.out.println();
    if (func(i))
       break first;
    for(int x=i; x<6; x++){
        System.out.print("*");
    }
  }
}
System.out.println("print '*'");
person Peter Lawrey    schedule 10.08.2013
comment
Тук научих нещо: Бях с погрешното впечатление, че можете да преминете само към обхващащи цикли, а не произволни обхващащи блокове. Може да искате да разработите малко по този въпрос! - person Ernest Friedman-Hill; 10.08.2013
comment
Какво прави func(i)? Ще премине ли към вътрешен for цикъл след отпечатване print '*'? - person Varun Jain; 10.08.2013
comment
func() е просто произволно булево условие -- няма значение какво е то. - person Ernest Friedman-Hill; 10.08.2013
comment
Вашият пример не прави това, което моят код възнамерява да направи! - person Varun Jain; 10.08.2013
comment
@VarunJ Можете ли да промените кода си, за да бъде по-ясен? Не мога да ти прочета мислите. ;) - person Peter Lawrey; 10.08.2013
comment
Просто искам да премина към друга част от кода (като goto). Изходът трябва да бъде print '*' * ** *** **** ***** - person Varun Jain; 10.08.2013
comment
Примерът, който дадох, прескача към друга част от кода. Ако всичко, което искате да направите, е да отпечатате триъгълник, нямате нужда от goto. Само два вложени цикъла. - person Peter Lawrey; 10.08.2013
comment
Искам първо изявлението за печат, отколкото „звездите“. Но без да включва оператора за печат преди цикъл for. Трябва да е след for цикъл. Както и да е, разбирам, че няма пряк път за преминаване към друга част от кода, без да използвате прекъсване, продължаване или метод. - person Varun Jain; 10.08.2013
comment
Има ли разумна причина да не поставите кода в реда, в който искате да го изпълните? Можете да направите това, но е грозно и объркващо. - person Peter Lawrey; 10.08.2013

Да, но има причина goto да не се използва. Ужасно е. Ако обаче просто сте любопитни, ето начин да го направите:

http://www.steike.com/code/useless/java-goto/

Ако вместо това искате да направите това по подходящ начин, задайте истинския си въпрос и посочете крайната си цел, за да можем да ви помогнем да я проектирате. :)

person Xabster    schedule 10.08.2013
comment
Това е впечатляващо :) - person Ernest Friedman-Hill; 10.08.2013
comment
Просто искам да преместя друга част от кода, без да разделям кода на различни „методи“. Като goto в C - person Varun Jain; 10.08.2013