我以前使用过几种方法来接受用户输入并将其作为某种数据类型返回给调用它的方法。我在以前的项目中使用过这些方法或它们的变体。
我采用了用于字符串的方法来选择给定的第一个字符并返回它,以便我可以在菜单中使用它。每次我启动应用程序时,都会出现主菜单并等待用户输入。收到这个输入后,程序不断循环,直到停止。这是我捕获字符的方法:
private char getUserChar(String prompt) {
try {
Scanner scan = new Scanner(System.in);
System.out.print(prompt);
String tempString = "";
tempString = scan.nextLine();
scan.close();
char userChar = tempString.charAt(0);
return userChar;
} catch(Exception ex) {
System.out.println(ex.getMessage());
}
return 0;
}
由于 try/catch 块,代码循环,因为 scan.nextLine() 从不等待下一个输入。没有它,异常通常与找不到新行有关。我已经尝试过似乎对其他人有用的 while(scan.hasNextLine());但是,一旦输入时间到达,它就永远不会跳出循环。我也不相信我在 nextInt() 问题上绊倒了,每个人似乎都遇到了麻烦。我将在下面发布整个课程的代码:
import java.util.Scanner;
import controller.Controller;
public class TUI {
private Controller controller;
public TUI() {
Controller controller = new Controller();
this.controller = controller;
}
public void run() {
boolean wantToQuit = false;
char userInput = 0;
System.out.println("Welcome to the Mart.");
do{
userInput = mainMenu();
if(isUserInputValid(userInput))
switch(userInput){
case 'a': addItem();
break;
case 'r': controller.removeItem();
break;
case 'i': controller.printInventory();
break;
case 'p': controller.customerPurchase();
break;
case 'w': controller.weeklyStock();
break;
case 'c': wantToQuit = true;
break;
}
else System.out.println("\nMainMenu");
} while(!(wantToQuit));
System.out.println("WolfMart is now closed. Thank you and good-bye.");
}
private boolean isUserInputValid(char userInput) {
char[] testSet = {'a', 'r', 'i', 'p', 'c', 'w'};
for(char currentChar : testSet) {
if(currentChar == userInput)
return true;
}
return false;
}
private char mainMenu() {
System.out.println();
controller.printInventory();
String mainMenuSelection = "What would you like to do: (a)dd item, (r)emove item, print (i)nventory, " +
"(p)urchase by customer, (c)lose store?\r\n";
char mainMenuInput = getUserChar(mainMenuSelection);
return mainMenuInput;
}
private char getUserChar(String prompt) {
try {
Scanner scan = new Scanner(System.in);
System.out.print(prompt);
String tempString = "";
tempString = scan.nextLine();
scan.close();
char userChar = tempString.charAt(0);
return userChar;
} catch(Exception ex) {
System.out.println(ex.getMessage());
}
return 0;
}
private int getUserInt(String prompt) {
Scanner scan = new Scanner(System.in);
int userInt = -1;
try {
System.out.print(prompt);
String input = scan.nextLine();
userInt = Integer.parseInt(input);
}
catch(NumberFormatException nfe) {
System.out.println("I did not recognize your command, please try again.");
}
scan.close();
return userInt;
}
private String getUserString(String prompt) {
Scanner scan = new Scanner(System.in);
String userString = null;
try{
System.out.print(prompt);
userString = scan.nextLine();
} catch(Exception ex)
{
System.out.println("I did not recognize your command, please try again.");
}
scan.close();
return userString;
}
private double getUserDouble(String prompt) {
Scanner scan = new Scanner(System.in);
double userDouble = -1.0;
try {
System.out.print(prompt);
String input = scan.nextLine();
userDouble = Double.parseDouble(input);
}
catch(NumberFormatException nfe) {
System.out.println("I did not recognize your command, please try again.");
}
scan.close();
return userDouble;
}
private void addItem() {
String itemName = "";
double price;
int quantity;
String namePrompt = "Enter the name of the item being added to the inventory: ";
String pricePrompt = "Enter the cost of " + itemName + ": ";
String quantityPrompt = "Enter the quantity of " + itemName + ": ";
itemName = getUserString(namePrompt);
price = getUserDouble(pricePrompt);
quantity = getUserInt(quantityPrompt);
controller.addItem(itemName, quantity, price);
}
}