我正在创建一个程序,它是银行账户系统的简单模型。我有一个简单的方法,当调用时要求用户输入名称(String)和起始账户余额(Double)并创建一个新的Person对象/帐户对象。
此方法通过使用1-9(int)选项的菜单调用,并说按下“1”创建新帐户。因此代码(在接受字符串之前)有一个默认输入。nextLine();在捕获实际名称输入之前捕获int输入的命令(customerName=input.nextLine();)。
我遇到的问题是,我试图在此方法中添加异常处理,以确保名称String输入仅为字母和空格。当第一次运行并且有人输入不正确的输入时,它会重新输出“请输入名称”,但随后他们必须输入名称两次,因为input.nextLine();仍然在那里(但没有捕获菜单输入)。所以我添加了一个if/etc决策结构,其中包含一个计数器,程序第一次运行时如果(计数器==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:
啊,我解决了我的问题。
我设置变量计数器=0;在我的方法的顶部,然后在底部设置连续输入=真;再次
现在它按预期工作。
所以工作代码看起来像:
public void menuOptionOne() {
counter = 0; // set counter to 0
do {
try {
if (counter == 0) {
System.out.println("Please input the customer's name: ");
input.nextLine();
customerName = input.nextLine();
matcher = pattern.matcher(customerName);
if (!matcher.find()) {
counter++;
throw new Exception("Try again. (Incorrect input: name must contain only letters)");
}
} else if (counter > 0) {
System.out.println("Please input the customer's name: ");
customerName = input.nextLine();
matcher = pattern.matcher(customerName);
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);
continueInput = true; // reset the continue input value
在输入检索中需要做两件事:
>
通过重用此方法允许一系列输入。
检查输入内容,如果不合适,请重新启动。
您使用的“通过重用此方法允许一系列输入”的方式是错误的根源<一般来说,当范围足够时,你应该倾向于使用最受限制的范围
通过将连续输入和计数器声明为字段变量而不是局部变量,可以在调用菜单选项one()之间创建耦合<这可以解释你的问题:
这会导致另一个问题,如果用户尝试创建多个帐户,它将导致程序在第二次调用时停止打印input.nextLine(),并自动假设菜单选项输入是应该的名称,并发送错误。有没有更好的方法让它按照我预期的方式工作?
这段代码应该足够了:
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);
}
您使用的“检查输入内容并在不合适的情况下重新开始”的方式有效,但您可以做得更简单,避免重复自己。
除非你开发的是非常简单的控制台应用, 否则你应该不希望php脚本代码产生的输出 直接被扔到激活的终端上. 捕获这些输出和你刚才用以覆写启动处理器的方法类似. 在sapi_module_struct中还有⼀些有用的回调: typedef struct _sapi_module_struct { ... int (*ub_write)(const char *str, unsigned
我有一个数据库表Cars,每一行代表不同的车型,具有不同的id、品牌、型号和数量。我想使用Hibernate编写一个查询,以获得按品牌划分的最受欢迎汽车的数量,例如,在DB中有5辆大众Polo、3辆大众Tiguan、4辆斯柯达Octavia、8辆斯柯德Rapid,我想得到一个结果:大众:5辆斯科达:8辆 这是我的疑问: 接口车看起来是这样的: 该查询在IntelliJ中工作正常,它带来了预期的结果
我正在尝试从一组大小未知的单选按钮中进行选择。(多套,但一步一步..)在实际站点上,它们不是值的text1。表单id是随机生成的,但遵循一种模式。所以我不能真的使用它。我得到了一个一致的课程.. 我已经尝试添加结束,什么也不会发生。
我正在尝试不同的方式选择一个特定的按钮使用seleninum webdriver与Java,但不幸的是,没有任何工作。 当我测试使用Selenium时,IDE是工作的。例如,我复制了相同的xpath,但当我试图在Java应用程序中进行测试时,任何东西都不起作用。我尝试使用不同的方法,通过.cssselector和通过.path。 这是我的HTML: 我需要选择带有文本“Create Applica
我想有一个依赖的数字输入。 此数字输入依赖于一个选择框,该选择框通过选择每个选项为输入创建一个特定的数字范围。 例如: 如果我们选择option2,数字输入将是min=20和max=50!如果我们选择option3,数字输入将是min=10和max=30!怎样才能创造出这样一个特征呢? 以下是我尝试过的:
问题内容: 我遇到了一个困扰我几天的问题。我在Python 2.7.10中使用了Paramiko模块,我想向Brocade路由器发出多个命令,但仅返回给定命令之一的输出,如下所示: 如果要打印完整的输出,它将包含发布到路由器的所有内容,但是我只想查看show命令的输出。 谁能解决这个问题? 我想问的最后一件事。我想过滤变量并检查是否出现诸如“ up”或“ down”之类的字符串,但是由于输出中的所