当我尝试访问不存在的帐户时银行程序错误

Bank Program error when I try to access an account that does not exist

在过去一周半的时间里,我一直在为我在学校的 Java class 研究这个银行项目。我以为我终于让它按照我的教练想要的方式工作了。但是,当我尝试访问一个不存在的帐户时,程序 "blows up"(我的导师的话)。我需要它让用户知道该帐户不存在并将他们重定向回主菜单。所以,我认为我的问题出在我银行 class 中的 findAcct 方法中。我尝试了几种修复方法,但 none 都奏效了。任何见解或帮助将不胜感激!我需要在星期一之前完成这项工作。我知道我说过问题出在一种方法中,但我会 post 我的整个程序的上下文。

银行Class

import java.util.Scanner;

public class Bank 
{
private int max = 25;
private int count;
bankAcct myAcct[] = new bankAcct[max];
Scanner scannerObject = new Scanner(System.in);

  public void openAcct()
  {
      if (count >= max){
        System.out.println("Not accepting new customers at this time.");
      }else{
        System.out.println("Please enter your name: ");
        String lname = scannerObject.next();
        myAcct[count] = new bankAcct(count + 1, 25, lname);
        count++;
        System.out.println("Thank you " + lname + ", your account number is: " + count);
        }

  }

  public int findAcct() // This is the method in question
  {
      int found = -1;
      System.out.println("Greetings, please enter your account number: ");
      found = scannerObject.nextInt();
      for(int i = 0; i < count; i++){
      if(myAcct[i].getAcctNum() == found){
          found = i;
          }
       }          
       return found;          
  }




  public void seeBal()
  {
      int lfound = findAcct();
      if (lfound == -1){
          System.out.println("Error!");
      }else{
          myAcct[lfound].dispBal();
          }
  }

  public void Deposit()
  {
      int lfound = findAcct();
      if (lfound == -1){
          System.out.println("Error!");
      }else{
          myAcct[lfound].makeDeposit();
          }
  }

  public void Withdrawal()
  {
      int lfound = findAcct();
      if (lfound == -1){
          System.out.println("Error!");
      }else{
          myAcct[lfound].makeWithdrawal();
          }
  } 
}

银行帐户Class

import java.util.Scanner;

public class bankAcct 
{
private double Bal;
private int acctNum;
private String name;
Scanner scannerObject = new Scanner(System.in);

public bankAcct(int pAcctNum, double pBal, String pName) 
{
    Bal = pBal;
    acctNum = pAcctNum;
    name = pName;
}   

    public void makeDeposit()
    {
        System.out.print( "Hello " + name + ", please, enter amount to deposit $");
        double lDep = scannerObject.nextDouble();
        Bal = Bal + lDep;
        System.out.println( " You have deposited $" + lDep);
        System.out.println( " Your new balance is $" + Bal);
    }

    public void makeWithdrawal()
    {
        System.out.print( "Hello " + name + ", please, enter amount to withdraw $");
        double lWDraw = scannerObject.nextDouble();
        if (lWDraw <= Bal){
            Bal = Bal - lWDraw;
            System.out.println( "You have withdrawn $" + lWDraw);
            System.out.println( "Your new balance is $" + Bal);
        }else{
            System.out.println("Insufficient funds!");
             }
    }

    public void dispBal()
    {
        System.out.println( "Hello " + name + ", your current balance is $" + Bal);
    }


        public int getAcctNum()
        {
            return acctNum;
        }

        public void setName(String pName)
        {
            name = pName;
        }

        public String getName()
        {
            return name;
        }


}

银行用户Class

import java.util.Scanner;

public class bankUser 
{
public static void main(String[] args) 

{
    Bank myBank = new Bank();

    int Choice; 

    do
    {
    dispMenu();

    Choice = getChoice();

    proChoice(Choice, myBank);
    }   
    while (Choice !=0);
}

public static void dispMenu()
{
    System.out.println( "|==================================|");
    System.out.println( "|    TONY'S FIRST NATIONAL BANK    |");
    System.out.println( "|***********Menu Options***********|");
    System.out.println( "|__________________________________|");
    System.out.println( "|  Press [1] To Open New Account   |");
    System.out.println( "|  Press [2] To View Balance       |");
    System.out.println( "|  Press [3] To Make Deposit       |");
    System.out.println( "|  Press [4] To Make Withdrawal    |");
    System.out.println( "|  Press [0] to Exit               |");
    System.out.println( "|__________________________________|");
    System.out.println( "|   Please Make Selection Now...   |");
    System.out.println( "|==================================|");
}

static int getChoice()
{
    Scanner scannerObject = new Scanner(System.in);
    int pChoice, Choice;
    pChoice = scannerObject.nextInt();  
    Choice = pChoice;
    return Choice;
}

static void proChoice(int Choice, Bank myBank)
{
    switch (Choice)
    {
        case 1: myBank.openAcct();
        break;      
        case 2: myBank.seeBal();
        break;
        case 3: myBank.Deposit();
        break;
        case 4: myBank.Withdrawal();
        break;
        case 0: System.out.println( "Thank you, come again.");
        break;
    }
}
}

再次感谢您的帮助。说到 Java,我还是个学徒。

*更新:我试过这段代码,它似乎有效!但是,我的导师告诉我,我们永远不能在一个方法中有 2 个 return 语句。

public int findAcct()
  {
      int found = -1;
      System.out.println("Greetings, please enter your account number: ");
      found = scannerObject.nextInt();
      for(int i = 0; i < count; i++){
      if(myAcct[i].getAcctNum() == found){
          return found = i;
          }
       }          
      return -1;
  }

更新:这是我对银行中的 findAcct 方法所做的 Class:

public int findAcct()
  {
      System.out.println("Greetings, please enter your account number: ");
      int acctNum = scannerObject.nextInt();
      int found = -1;
      for(int i = 0; i < count; i++){  
          if(myAcct[i].getAcctNum() == acctNum){
              found = i;
              break; //Ends Loop
          }
      }     
      return found; 
  }

我的老师不介意 break 语句,所以我在 for 循环的末尾添加了 out。我还移动了我的局部变量 found = -1;向下几行。感谢您的帮助!我迫不及待想了解更多!

如果你不想在一个方法中有 2 个 return 语句(你可以有,但有时在你开始编码时这是不好的做法,所以教授喜欢只制定那个规则)你可以使用您找到的变量存储将在函数末尾 returned 和 return found 的值。

你走在正确的轨道上。

示例:

public int findAcct()
  {
      int found = -1;
      System.out.println("Greetings, please enter your account number: ");
      found = scannerObject.nextInt();
      for(int i = 0; i < count; i++){
      if(myAcct[i].getAcctNum() == found){
           found = i;
           break; //Exit out of the loop 
          }
       }          
      return found;
  }

如果找到帐户,此代码会将 found 设置为 i,然后 break 退出循环。跳出循环后,它将 return 找到。否则,将永远不会设置 found 和 return -1,因为您在顶部将其初始化为 -1。

如果你的老师还没有教你 break 语句,那么你可以使用一个布尔变量 foundAccount 初始化为 false。然后在执行 if 语句检查之前检查 foundAccount 是否为 false。一旦找到它,将其设置为 true,这样您就不会一直寻找。

示例:

public int findAcct()
  {
      int found = -1;
      boolean foundMatch = false;
      System.out.println("Greetings, please enter your account number: ");
      found = scannerObject.nextInt();
      for(int i = 0; i < count; i++){
      if(!foundMatch){
      if(myAcct[i].getAcctNum() == found){
           found = i;
           foundMatch = true; //we will no longer search
          }
       }
       }          
      return found;
  }