Есть ли способ выполнить функцию перехода в 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). Вывод должен быть напечатан '*' * ** *** **** ***** - person Varun Jain; 10.08.2013
comment
В приведенном мной примере происходит переход к другой части кода. Если все, что вам нужно сделать, это напечатать треугольник, вам не нужен переход. Всего две вложенные петли. - person Peter Lawrey; 10.08.2013
comment
Я хочу сначала напечатать заявление, а не «звезды». Но не включая оператор печати перед циклом for. Это должно быть после цикла for. В любом случае я понимаю, что нет быстрого способа перейти к другой части кода без использования break, continue или метода. - person Varun Jain; 10.08.2013
comment
Есть ли разумная причина не размещать код в том порядке, в котором вы хотите его выполнить? Вы можете это сделать, но это некрасиво и сбивает с толку. - person Peter Lawrey; 10.08.2013