2014-01-19 2 views
-1

У меня есть код, как этотКак прыгать в Java

public class Test 
{ 

    public static void main(String[] args) 
    { 
     continue s; 
     System.out.println("I am not supposed to print this"); 
     s: 
     System.out.println("I am suppose to print this"); 

    } 
} 

Я получаю ошибку

java: undefined label: s 

Что не так?

+3

Java не поддерживает 'GOTO' (и тому подобное). И, честно говоря, я думаю, что 'GOTO' делает код запутанным. – str

ответ

0

В принципе, нет никакого практического способа сделать это в Java. Кажется, вы пытаетесь сделать эквивалент «goto», и это не поддерживается на Java. Операторы break label и continue label могут подключаться только к , прилагая к нему.

Теперь в соответствии с Java формальной грамматики вы могли бы написать это:

s: { 
     continue s; 
     System.out.println("I am not supposed to print this"); 
    } 
    System.out.println("I am suppose to print this"); 

но еще не будет компилировать по двум причинам:

  • продолжени разрешается только филиалу на метку в выражении цикла. (A break не имеет такого ограничения ... но ...)

  • continue (или break) делает следующее заявление недостижим.

Смотрите также: Alternative to a goto statement in Java


Но есть один довольно хитрый способ получить код "работать":

static final boolean flag = true; // class attribute ... 

    ... 

    s: { 
     if (flag) break s; 
     System.out.println("I am not supposed to print this"); 
    } 
    System.out.println("I am suppose to print this"); 

"тест" будет оцениваться компилятор так, чтобы break был фактически безусловным. Но JLS говорит, что первый println будет обработан как доступным, так что вы не получите недостижимую ошибку кода.

Я думаю, что это может быть полезным, если вы генерируете этот исходный код. Кроме того, это (ИМО) просто любопытство. Это проще сделать с помощью обычного заявления if/else ... или путем полного удаления первой «печати».

0

продолжение - ключевое слово в Java, используемое для . Пропустить итерации цикла. Если вы пытаетесь найти эквивалент GOTO, вы должны пересматривают, как вы пытаетесь решить вашу проблему, GOTO никогда не является правильным выбором, когда-либо.

0

Насколько я знаю, нет Гот в Java (есть ключевое слово, но это не имеет никакого значения)

1

Прыжки, как это не возможно в Java, единственный способ, чтобы перейти от петель, пока и делаю.

Читать @Heinzi ответ

2.2.6 Нет Goto Заявления

Java не имеет Гото заявление. Исследования показали, что goto (mis) используется чаще, чем не просто «потому что он есть». Устранение goto привело к упрощению языка - нет правил о влиянии goto на середину оператора for, например. Исследования примерно на 100 000 строк кода C определили, что примерно 90 процентов операторов goto использовались исключительно для получения эффекта выхода из вложенных циклов. Как упоминалось выше, многоуровневый разрыв и продолжение устраняют большую часть необходимости в операциях goto.

The Java Language Environment, James Gosling and Henry McGilton, 1996

1

Там нет "Гото" в Java. И «continue» выполняет немного другую функцию. Вы можете использовать «продолжить», например, в виде петель, как:

class ContinueDemo { 
    public static void main(String[] args) { 

     String searchMe = "peter piper picked a " + "peck of pickled peppers"; 
     int max = searchMe.length(); 
     int numPs = 0; 

     for (int i = 0; i < max; i++) { 
      // interested only in p's 
      if (searchMe.charAt(i) != 'p') 
       continue; 

      // process p's 
      numPs++; 
     } 
     System.out.println("Found " + numPs + " p's in the string."); 
    } 
} 

В приведенном выше примере, если, например, searchMe.charAt(5) != 'p' то цикл будет продолжаться с начала цикла от I = 6, и numPs++; не будут обработаны.

Вы можете прочитать об этом здесь: Branching Statements

0

Теоретически, в Java есть утверждения по скачку return и break.

Оператор return выпрыгивает из метода с возвратными значениями в вызывающий оператор или без них.

Операция break выпрыгивает из петель.

Как упоминалось в предыдущих ответах, goto не доступен на Java и не считается хорошей практикой программирования в процедурном или объектно-ориентированном программировании. Он существовал еще в дни последовательного программирования.

Смежные вопросы