2017-08-10 53 views
-6
import java.util.Scanner; 
class testing 
{ 
    int i ; int j ; 
    Scanner sc = new Scanner(System.in) ; 
    void lolwa() 
    { 
     out: 
     for(i = 0 ; i <= 6 ; i++) 
     { 
      System.out.println(i); 
     } 
     System.out.println("Enter 1 to restart loop"); 
     System.out.println("Enter 2 to continue till 10"); 
     j = sc.nextInt(); 
     if(j == 1) 
     { 
      continue out ; 
     } 
     if(j == 2) 
     { 
      for(i = 7 ; i <= 10 ; i++) 
      { 
       System.out.println(i); 
      } 
     } 
    } 
} 

我编译它在BlueJ,它说:“未定义标签出”。我只是用continue语句学习,因此我不能找出问题标记继续语句无法编译

+0

一个奇怪的问题:为什么不直接调用'lolwa()'而不是使用continue? – Nathan

+2

你的继续在标签出来的循环已经完成后出现。你有没有错过你的牙套? –

+4

您应该正确缩进代码 - “继续”需要处于循环状态。 – assylias

回答

5

out标签“诠释”这个for循环:

out: 
for(i = 0 ; i <= 6 ; i++) 
{ 
    System.out.println(i); 
} 

因此,为了继续与标签out,它会需要在之内for循环。在for循环结束后使用它没有意义。这将编译,例如:

out: 
for(int i = 0; i <= 6; i++) 
{ 
    System.out.println(i); 
    continue out; 
} 

但是,在这种情况下,您不需要标记的continue语句。没有歧义。只有一个循环可以“继续”出来。

Oracle tutorial很好地解释了它。


值得一提的是,我甚至不记得上一次我不得不使用标记继续 - 也许从来没有。除非你几乎没有别的选择,否则我会避开它们。

+2

我只能假设它是来自程序集的JSR命令(例如)的剩余部分。我之前使用过它们,因为几乎没有其他选择。使用标签来控制像java这样的高级语言中的逻辑流程的IMO几乎代表了每种情况下的糟糕设计。 – tnw

+0

有替代(标志变量和/或冗余检查)不必要地使代码复杂化的嵌套循环用例有限。他们几乎没有。 :-) –

+0

@Michael我不知道你为什么用break语句来演示它。 TO正在使用继续。该示范以同样的方式应对,但仍然是:p – Nathan

1

我认为你没有得到continue label的使用:它必须在循环中使用,并用于跳转到你的特定标签。一个if语句是而不是一个循环。只需拨打lolwa()即可更换您的continue out,您将获得理想的bahaviour:您将被发送到您的功能的开始。