如果发生异常,有没有办法让我的程序在do-while循环的一开始就启动



我希望它在最外层的for循环中重新启动,这样,如果用户混淆了输入,他们可以再次登录,一切都会像程序重新启动一样工作。我尝试使用continue语句和break语句,并使用循环的昵称。像

outer: do {
//loop code
}
then break outer;

问题是,当我这样做的时候,它会打乱我对循环的控制。询问用户是否要返回主菜单的结束语句。现在,如果遇到异常,我只需要使用return语句退出应用程序,但如果我要退出,我还不如让应用程序崩溃。我想实际解决这种情况,并要求用户提供有效的输入。

package main;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Scanner;
import model.BankAccount;
public class app {
static Scanner console = new Scanner(System.in);

public static void main(String[] args) {

HashMap<String, BankAccount> accounts = new HashMap<>();
BankAccount sallyAccount = new BankAccount(1000);
BankAccount bobAccount = new BankAccount(2000);
BankAccount naomiAccount = new BankAccount();
accounts.put("Sally", sallyAccount);
accounts.put("Bob", bobAccount);
accounts.put("Naomi", naomiAccount);
String name;
BankAccount account;
int userInput;
double amount;
boolean again;

do
{
again = true;
System.out.println("Login: Enter your name.");
name = console.next();
account = accounts.get(name);
if(account == null)
{
System.out.println("Please enter a valid name.");
return;
}

do
{
System.out.println("1 - Deposit");
System.out.println("2 - Withdraw");
System.out.println("3 - View Balance");
System.out.println("4 - Logout");
userInput = console.nextInt();
switch(userInput)
{
case 1:
System.out.println("Enter amount to deposit: ");
try
{
amount = console.nextDouble();
}
catch(InputMismatchException e)
{
System.out.println("Please enter a numeric amount.");
return;
}
if(amount < 0)
{
System.out.println("You can't withdraw a negative amount");
return;
}
account.deposit(amount);
break;
case 2:
System.out.println("Enter amount to withdraw: ");
try
{
amount = console.nextDouble();
}
catch(InputMismatchException e)
{
System.out.println("Please enter a numeric amount.");
return;
}
if(amount < 0)
{
System.out.println("You can't withdraw a negative amount");
return;
}
account.withdraw(amount);
break;
case 3:
System.out.println(account.getBalance());
break;
case 4:
again = false;
break;
default:
System.out.println("Enter a valid option.");
}
}
while(again);
System.out.println("Back to main menu? 1 - Yes, 2 - No");
try
{
userInput = console.nextInt();
}
catch(InputMismatchException e)
{
System.out.println("Please enter a number");
return;
}
}
while(userInput == 1);
}
}
package model;
public class BankAccount {
private double balance = 0;

public BankAccount() {}

public BankAccount(double balance)
{
this.balance = balance;
}

public void deposit(double amount)
{
balance = balance + amount;
}

public void withdraw(double amount)
{
if((balance - amount) < 0)
{
System.out.println("Transaction Failed: You can't withdraw more than you have.");
}
else
{
balance = balance - amount;
}
}

public double getBalance()
{
return balance;
}
}

最好将主函数分解为多个处理控制逻辑不同部分的函数。一个好的经验法则(对于刚开始编程的程序员来说(是,一个超过10-15行的函数可能是多个函数,尽管这不是一个铁律。

我把你的程序改写成了多个函数,但因为这看起来像是一个家庭作业问题,所以我不会发布整个程序。相反,这是一个包含一些片段的总体策略。

例如,当用户输入要存入或取出的金额时。你的程序在那一刻想要的是一个double,所以你可以请求一个double,并让另一种方法来找到它:

switch (getMenuChoice()) {
case 1:
account.deposit(getDepositOrWithdrawAmount("deposit"));
break;
case 2:
account.withdraw(getDepositOrWithdrawAmount("withdraw"));
break;
// etc.
}

然后,该函数负责无限循环,直到用户提供有效值:

static double getDepositOrWithdrawAmount(String depositOrWithdraw) {
// loop infinitely until we get a valid value
while (true) {
System.out.println("Enter amount to " + depositOrWithdraw);
try {
double amount = console.nextDouble();
if (amount < 0) {
System.out.println("You can't " + depositOrWithdraw + " a negative amount.");
} else {
// valid value! return for deposit / withdraw to use
// , ending the infinite loop
return amount;
}
} catch (InputMismatchException e) {
System.out.println("Please enter a numeric amount.");
// clear the bad token from the stream
// if you don't do this, each time you
// call `nextDouble`, the same value will
// be returned, causing an infinite loop
console.next();
}
}
}

这个功能的好处是它可以独立工作:

public static void main(String[] args) {
System.out.println("Test: " + getDepositOrWithdrawal("test!"));
}

给出以下结果:

Enter amount to test!
abc
Please enter a numeric amount.
Enter amount to test!
not-a-number
Please enter a numeric amount.
Enter amount to test!
-5 
You can't test! a negative amount.
Enter amount to test!
1000
Test: 1000.0

这可以让您测试程序的各个部分是否独立工作,而不是试图调试一个大程序。

您也可以将程序的其他部分编写为函数,但我将把它留给您。

最新更新