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

时间:2015-03-27 20:03:43

标签: java java.util.scanner

过去一周半,我一直在学校为我的Java课程开设这个银行计划。我以为我终于按照我的导师想要的方式工作了。但是,当我尝试访问不存在的帐户时,该程序会爆炸" (我的导师的话)。我需要它让用户知道该帐户不存在并将其重定向回主菜单。所以,我认为我的问题出在我班级的 findAcct 方法中。我尝试了几个修复但没有一个有效。任何见解或帮助将不胜感激!我需要在星期一之前完成这项工作。我知道我说的问题在于一种方法,但我会将整个程序发布到上下文中。

银行等级

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();
          }
  } 
}

bankAcct 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;
        }


}

bankUser 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方面,我仍然是一个padawan。

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

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方法所做的操作:

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; 
  }

我的导师不介意断言,所以我在for循环结束时添加了。我还移动了我的局部变量found = -1;几行。谢谢你的帮助!我等不及要了解更多!

1 个答案:

答案 0 :(得分:0)

如果你不想在一个方法中有2个返回语句(你可以拥有它,但有时候你开始编码是不好的做法,所以教授们喜欢制定那个规则)你可以使用你的found变量存储将返回的值,并在函数末尾返回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。在它退出循环后它将返回找到。否则,find将永远不会被设置并返回-1,因为您在顶部将其初始化为-1。

如果您的教师尚未教您break语句,那么您可以使用初始化为false的布尔变量foundAccount。然后在进行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;
  }