2015-12-25 35 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