2016-12-26 111 views
0

我在while循環中做出了選擇菜單。爲了確保用戶有一個有效的選擇,我把菜單本身放在一個try catch塊中:圍繞選擇菜單嘗試捕捉

我希望用戶獲得一個新的機會,如果發生異常,所以我把try-catch塊放入一段時間(真)的循環。但是,使用這種循環,動作編碼的部分變成不可達代碼。

有沒有辦法做得更好?

還有一個問題,我如何防止用戶輸入不存在的選項?

while (choice != 0) { 
    /* Ask for player's choice */ 
    while(true) { 
     try 
     { 
      BufferedReader menuInput = new BufferedReader(new InputStreamReader(System.in)); 
      System.out.println(); 
      System.out.println("Please choose between the following options:'"); 
      System.out.println(" (1) Make new animal"); 
      System.out.println(" (2) Feed Animals"); 
      System.out.println(" (3) Count animals"); 
      System.out.println(" (0) Quit"); 
      System.out.print("Enter your choice: ");; 
      choice = Integer.parseInt(menuInput.readLine()); 
     } catch (NumberFormatException ex) { 
      System.err.println("Not a valid number"); 
     } catch (IOException e) { 
      System.out.println("Failed to get input"); 
     } 
    } 
    // first choice option: 
    if (choice == 1) { 
     //actions 
    } 
    // second choice option: 
    if (choice == 2) { 
     //actions 
    } 
    // third choice option: 
    if (choice == 3) { 
     //actions 
    } 
} 
System.out.print("Thank you for playing!") 
+2

應該有一些條件*斷*循環。例如,一個'break'聲明。 – David

+0

您可以編寫一個額外的私有方法,在處理當前選擇之前驗證輸入。 – pidabrow

回答

2

做的非常簡單的方法是設置你的循環上方的布爾標誌:

boolean waitingForAnswer = true; 

,然後就改變你的while循環條件while(waitingForAnswer)並設置waitingForAnswerfalse一個已經經過公認。

然後,你可以使用相同的結構,以防止他們進入5,或其他任何。簡單地標記上到底有沒有來檢查,如果該值是一個公認的一個,如果它不是一個if,不改變waitingForAnswer

編輯: 順便說一句,你在底部的if語句串是不是非常高效。如果用戶輸入「1」,那麼if (choice==1)塊將觸發,然後它將繼續檢查它是否等於2,如果等於3等,當我們知道它不會。那裏使用else if

另一個編輯: 此外,創建您的輸入流閱讀器以外的循環。目前,您每次循環運行時都會創建一個新的。