gpt4 book ai didi

java - 捕获我的选择输入时出现问题

转载 作者:行者123 更新时间:2023-11-30 06:45:46 26 4
gpt4 key购买 nike

我正在创建一个程序,它是银行帐户系统的简单模型。我有一个简单的方法,在调用时要求用户输入名称(字符串)和起始帐户余额( double )并创建一个新的人员对象/帐户对象。

通过使用 1-9 (int) 选项的菜单调用此方法,并假设按下“1”来创建新帐户。所以代码(在接受字符串之前)有一个默认的 input.nextLine();命令在捕获实际名称输入之前捕获 int 输入(customerName = input.nextLine();)。

我遇到的问题是我试图向此方法添加异常处理,以确保名称字符串输入仅为字母和空格。第一次运行时,如果有人输入错误,它会重新输出“请输入名称”,但自 input.nextLine(); 以来,他们必须输入名称两次;仍然在那里(但没有捕获菜单输入)。因此,我添加了一个带有计数器的 if/else 决策结构,程序第一次运行时,如果 (counter == 0) 则保留 input.nextLine() 并递增计数器,但如果 (counter > 0)它摆脱了 input.nextLine() 以便程序运行良好。

这会导致另一个问题,如果用户尝试创建多个帐户,则会导致程序在第二次调用时停止打印 input.nextLine() 并自动假定菜单选项输入的名称是什么应该是,并发送错误。有没有更好的方法让它按照我的预期方式工作?

抱歉,如果描述不是很清楚,这是一个很难描述的问题。

代码如下:

public void menuOptionOne() {
do {
try {
if (counter == 0) { // counter is initially set to 0
System.out.println("Please input the customer's name: ");
input.nextLine(); // catches the menu input
customerName = input.nextLine();
matcher = pattern.matcher(customerName);
counter++; // increments the counter in case the user's input is invalid
if (!matcher.find()) { // if it has non-letter/space characters present, throws exception
throw new Exception("Try again. (Incorrect input: name must contain only letters)");
}
} else if (counter > 0) { // asks the user to input name again, without the input.nextLine() which is intended to catch the menu int input
System.out.println("Please input the customer's name: ");
customerName = input.nextLine();
matcher = pattern.matcher(customerName); // checks the input to ensure it is only letters and/or spaces
if (!matcher.find()) {
throw new Exception("Try again. (Incorrect input: name must contain only letters)");
}
}
continueInput = false;
} catch (Exception ex) {
System.out.println(ex.toString());
}
} while (continueInput);

因此,当连续调用两次时,它会自动转到第二个决策结构,无需 input.nextLine(),并且捕获菜单输入 (1) 并引发异常。如何让它在每次调用该方法时都能正常工作?

这是连续调用两次时的输出(注意:它将菜单输入保存为新的客户名称,即使它是一个数字):

Please input the customer's name: 
java.lang.Exception: Try again. (Incorrect input: name must contain only letters)
Please enter the new balance:

最佳答案

您想在输入检索中做两件事:

  • 通过重用此方法允许一系列输入。

  • 检查输入的内容,如果不合适则重新开始。

您使用的“通过重用此方法允许一系列输入”的方式是错误的根源。
一般来说,当足够时,您应该倾向于使用最受限制的范围。
通过将 continueInputcounter 声明为字段变量而不是局部变量,您可以在 menuOptionOne() 的调用之间创建耦合。
这解释了你的问题:

This causes another problem, that if the user tries to create multiple accounts, it will cause the program to stop printing the input.nextLine() the second time it is called and automatically assume the menu option input is what the name is supposed to be, and sends an error. Is there a better way to get this working the way I intended?

这段代码应该足够了:

public void menuOptionOne() {

// change
int counter = 0;
boolean continueInput = true;
// end change

do {
try {
if (counter == 0) { // counter is initially set to 0
System.out.println("Please input the customer's name: ");
input.nextLine(); // catches the menu input
customerName = input.nextLine();
matcher = pattern.matcher(customerName);
counter++; // increments the counter in case the user's
// input is invalid
if (!matcher.find()) { // if it has non-letter/space
// characters present, throws
// exception
throw new Exception("Try again. (Incorrect input: name must contain only letters)");
}
} else if (counter > 0) { // asks the user to input name again,
// without the input.nextLine()
// which is intended to catch the
// menu int input
System.out.println("Please input the customer's name: ");
customerName = input.nextLine();
matcher = pattern.matcher(customerName); // checks the input
// to ensure it
// is only
// letters
// and/or spaces
if (!matcher.find()) {
throw new Exception("Try again. (Incorrect input: name must contain only letters)");
}
}
continueInput = false;
} catch (Exception ex) {
System.out.println(ex.toString());
}
} while (continueInput);
}

您使用的“检查输入内容,如果不合适则重新开始”的方法是有效的,但您可以做得更简单,避免重复。

关于java - 捕获我的选择输入时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com