2015-12-25 36 views
3

我正在从事一项练习练习,在我的在线追求中学习Java并难倒了!Java:Labeled Break

我的程序的要点是我有用户通过输入一个字符选择一个选项,然后程序继续基于值的情况。如果默认情况下执行,这意味着输入无效,我想然后返回到用户输入提示。

我最初的想法是使用'goto',然而从我所了解的情况来看,除了阅读代码之外,我可能会被任何人用石头打死。然后有一个事实,goto不存在于Java中...所以,当谷歌搜索,我发现'标记休息'。它看起来就像我所需要的。然而,我已经插入标签的位置是无法识别的,即使它与案例在同一班级。我应该如何去做这件事?

String newLine = System.getProperty("line.separator"); 

    restart: 

    System.out.println("Please select the type of shape you wish to calcuate information for: " 
    + newLine + "A: Square" + newLine + "B: Rectangle" + newLine + "C: Circle"); 

    char typeShape = input.next().charAt(0); 

    String shape = Character.toString(typeShape); 

    switch (shape.toLowerCase()) { 
     case "a": 
      //do something 
      break; 
     case "b": 
      //do something 
      break; 
     case "c": 
      //do something 
      break; 
     default: 
      System.out.println("Invalid selection. Please re-enter shape."); 
      break restart; 
    } 

回答

4

我想一个简单的方法将使用do-while循环。如果条件不满足(无效输入/字符),继续循环,否则将标志设置为false并出来。

boolean inputFlag; 
do { 
System.out.println("Please select the type of shape you wish to calcuate information for: " 
    + newLine + "A: Square" + newLine + "B: Rectangle" + newLine + "C: Circle"); 

    char typeShape = input.next().charAt(0); 
    String shape = Character.toString(typeShape); 

    switch (shape.toLowerCase()) { 
    case "a": 
     inputFlag = false; 
     //do something 
     break; 
    case "b": 
     inputFlag = false; 
     //do something 
     break; 
    case "c": 
     inputFlag = false; 
     //do something 
     break; 
    default: 
     System.out.println("Invalid selection. Please re-enter shape."); 
     inputFlag = true; 
    } 
} while (inputFlag); 
3

Java允许你标注一循环结构(例如forwhile),然后跳出循环的内部的一个的向的外平。

该语言不允许您标记任意行并将它们“转到”它们。

UPDATE:显然我错了。 Java支持标记任意块(但不包括单个语句)。见https://stackoverflow.com/a/1940322/14731

4

我相信你想标签块。喜欢的东西

restart: { 
    System.out.println("Please select the type of shape you wish to calculate " 
     + "information for: " + newLine + "A: Square" + newLine + "B: Rectangle" 
     + newLine + "C: Circle"); 

    char typeShape = input.next().charAt(0); 

    String shape = Character.toString(typeShape); 

    switch (shape.toLowerCase()) { 
    case "a": 
     //do something 
     break; 
    case "b": 
     //do something 
     break; 
    case "c": 
     //do something 
     break; 
    default: 
     System.out.println("Invalid selection. Please re-enter shape."); 
     break restart; 
    } 
} 
+1

@JVX一个更好的方法将是使用某种类型的循环再标签。 – YoungHobbit

+0

真棒,感谢您的快速回复!这有助于了解标记的休息时间。然而...当我实现这个并测试它时,程序在达到这个中断后结束,而不是循环回到标签。这是为什么发生? – JVX

+0

@JVX。是。你从标签上“破碎”。基本上它会从break语句提供的标签中出来。 – YoungHobbit

2

标记块时出于同样的原因goto是不可取的皱起了眉头:这不是一个自然流动。

虽这么说,你可能想知道你将如何管理你想要的行为,这是非常简单的:使用循环

//pseudo-code 
while(something) { 
    repeatCode 
} 

在你的情况,你会做这样的事情:

boolean choosing = true; 
while(choosing) { 
    switch(...) { 
     case "a": 
      choosing = false; 
      break; 
     case "b": 
      choosing = false; 
      break; 
    } 
} 

您可能会发现这有点冗长。相反,只要进入循环,您可以将选择设置为false,如果用户没有输入正确的名称,则将其设置为true。

或者更好的是,使用do-while循环

boolean choosing = false; 
do { 
    switch(...) { 
     case "a": 
      break; 
     default: 
      choosing = true; 
      break; 
    } 
} while(choosing); 
+1

太棒了,谢谢你为我打破这个。我很欣赏答案! – JVX