gpt4 book ai didi

java - 如何针对特定情况重复 `try` block ?

转载 作者:行者123 更新时间:2023-11-29 04:42:52 26 4
gpt4 key购买 nike

我这里有一个程序接受数值(存储为 BigDecimal)和存储为 String 的货币(美元或人民币)。在用户的帮助下dimo414 ,我能够解释空白输入和非数字输入,同时还允许用户重试,直到读取到有效输入。

代码如下:

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter the amount of money and specify"
+ " currency (USD or CNY): ");
Boolean invalidInput; // breaks out of do-while loop after successful outcome

do {
invalidInput = false;
try {
String line = input.nextLine();
Scanner lineScan = new Scanner(line);
BigDecimal moneyInput = lineScan.nextBigDecimal();
String currency = lineScan.next();

if (currency.equals("USD")) {
// convert USD to CNY
} else if (currency.equals("CNY")) {
// convert CNY to USD
} else {
/*
reprompt user for currency,
but retain the value of moneyInput;
repeat process until valid currency
*/
}
} catch (NoSuchElementException | IllegalStateException e) {
// deals with errors:
// non-numeric moneyInput or blank input
}
} while (invalidInput);
}

现在我在处理 moneyInput 有效但 currency 无效的情况时遇到了麻烦,例如100.00 abc。在这种情况下,我想提示用户重新输入 currency 的值,同时保留 money 的值。

我尝试在提示输入 currency 的部分使用类似的 do-while 循环,然后像这样继续到 if-else block :

do {
String currency = lineScan.next();

if (currency.equals("USD")) {
// convert USD to CNY
} else if (currency.equals("CNY")) {
// convert CNY to USD
} else {
invalidInput = true;
System.out.print("Please enter a valid currency: ");
// since invalidInput == true,
// jump back up to the top of the do block
// reprompt for currency
}
} while (invalidInput);

但是这个解决方案是无效的,因为它会显示来自外部 catch block 的异常错误消息,所以我实际上必须在一个 try-catch block 内实现一个 do-while 循环try-catch block ,这很快就变得一团糟。

我还尝试在 main 之外定义一个名为 readCurrency 的新函数,我可以在 else block 中调用它,但我遇到了问题变量范围。我仍然是 Java 的初学者,所以我不知道如何正确定义函数并将必要的信息传递给它。

还有哪些其他方法可以循环回到该 try block 的顶部并允许用户仅重新输入货币

非常感谢阅读并提供反馈。

最佳答案

您将输入验证与处理混合在一起。一次做一件事,先验证,再处理。使用帮助程序对代码进行一点模块化,这就变得足够简单了。

String amountString;
String currencyString;
do {
System.out.println("Please insert a valid amount and currency");
String line = input.readLine();
String[] values = line.split("\\s"); //split on the space
amountString = values[0];
currencyString = values[1];

}
while (!isValidAmount(amountString));
while (!isValidCurrencyString(currencyString) {
System.out.println("Amount accepted but unsupported currency. Please input only the correct currency now");
currencyString = input.nextLine();
}

现在你需要的是辅助方法:

  • boolean isValidAmount(String amountString)
  • boolean isValidCurrency(String currencyString)

一旦你有了它们,并完成了验证,你就可以实际插入处理逻辑了:

BigDecimal amount = BigDecimal.parse(amountString); //this may be the wrong name of the parse function, don't remember but something like that;
switch(currencyString) {
case "USD": //...
}

你能自己写辅助方法吗?它们应该很简单:)

关于java - 如何针对特定情况重复 `try` block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38478019/

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