【问题标题】:Bank account class with 2 child class not showing appropriate error message具有 2 个子类的银行帐户类未显示适当的错误消息
【发布时间】:2015-05-26 10:39:40
【问题描述】:

我的学业需要帮助,我对编程非常陌生。所以要求是:

类帐户,将所有数据的可见性更改为受保护。更改withdraw方法,使其成为抽象方法。此操作将需要您将类声明为抽象类。存款在 OnLineAccount 和 SavingsAccount 中的工作方式应相同,因此请确保它们不能覆盖其父版本的版本。

OnLineAccount 类比 Account 类多了一个属性 minimumBalance。 OnLineAccount 的所有实例都是在将 minimumBalance 金额设置为 $500 的情况下创建的。如果任何 OnLineAccount 的交易导致余额低于 minimumBalance,则从账户余额中扣除 25 美元的费用。覆盖toString 方法以显示帐户toString 显示的所有内容以及取决于余额的消息。如果余额低于 minimumBalance,则需要提示客户已扣除 25 美元费用的消息。使用父类toString 完成大部分工作。

SavingsAccount 类比 Account 类的属性多了一个属性,即透支。所有 SavingsAccount 实例都是在透支金额设置为 -$1000 的情况下创建的。透支金额是 SavingsAccount 类的对象可能允许余额达到的金额。实施提款方法,以便透支最多可达到透支中存储的金额。允许余额降至零以下并达到透支金额的任何提款都是允许的,但每次交易导致余额低于零时,都会产生 30 美元的透支费。 覆盖toString 方法以显示帐户toString 的所有内容 显示加上一条取决于天平的消息。如果余额低于零,则说明此人处于透支状态且已产生 30 美元费用的消息。使用父类toString 完成大部分工作。

创建一个包含 5 个 Account 对象数组的驱动程序类,作为子类 OnLineAccount 或 SavingsAccount 的一些实例。系统地测试两个子类的全部功能。

=================================

所以我创建了 4 个类文件,它显示所有帐户信息,但也显示负余额,这应该是一条错误消息,而不是因为余额不应低于 500 美元。

这是我的类文件:

账户类:

    import java.text.NumberFormat;
    import java.util.Locale;

    public abstract class Account {

    private static int defaultAccountNo = 12345;
    protected String owner;
    protected int accountNo;
    protected double balance;

    protected Account(String owner, double intialDeposit){
        this.owner = owner;
        this.balance = intialDeposit;
        defaultAccountNo++;
        this.accountNo = defaultAccountNo;
    }

    public final boolean deposit(double amount){
        if(amount<=0){
            System.err.println("Negative amount can't be deposited");
            return false;
        }
        balance = balance+amount;
        return true;
    }

    protected abstract boolean withdrawl(double amount);

    public String getBalance(){
        return formatter.format(balance);
    }
    public int getAccountNo(){
        return accountNo;
    }

    public void setOwner(String owner){
        this.owner = owner;
    }

    protected void addInterest(){
        double interest = 0.05*balance;
        balance = balance+interest;
    }

    public boolean equals(Account account){
        if(this.owner.equalsIgnoreCase(account.owner))
            return true;
        else
            return false;
    }

    NumberFormat formatter = NumberFormat.getCurrencyInstance();

    public String toString(){
        return "AccountNo: "+accountNo+"\nBalance: "+formatter.format(balance);
     } 


   }

OnlineAccount 类:

public class OnLineAccount extends Account{

public OnLineAccount(String owner, double intialDeposit) {
    super(owner, intialDeposit);
}

private static final double MINIMUM_BALANCE = 500;


public boolean withdrawl(double amount){
    if(amount<0){
        System.err.println("Negative amount cannot be withdrawn");
        return false;
    }
    if((balance-amount)<0){
        System.err.println("Not enought balance");
        return false;
    }
    balance = balance-amount;
    if(balance<MINIMUM_BALANCE)
        balance = balance - 25;
    return true;
}

public String toString(){
    String returnString;
    if(balance<500){
        returnString = super.toString()+"\n$25 fee has been already been subtracted as account balance reached below minimum";
        return returnString;
    }
    return super.toString();

  }


}

SavingsAccount 类:

 public class SavingsAccount extends Account{

    private static final double DEFAULT_OVERDRAFT = -1000;

    public SavingsAccount(String owner, double intialDeposit) {
        super(owner, intialDeposit);
    }

    public boolean withdrawl(double amount) {
        if(amount<0){
            System.err.println("Negative amount cannot be withdrawn");
            return false;
        }
        if((balance-amount-30)<DEFAULT_OVERDRAFT){
            System.err.println("Not enough balance, overdraft reached");

        }
        if((balance-amount)<0){
            balance = balance-amount-30;
            return true;
        }
        return false;
    }

    public String toString(){
        String returnString;
        if(balance<500){
            returnString = super.toString()+"\nYour are in overdraft and $30 fee has been already been subtracted.";
            return returnString;
        }
        return super.toString();

      }

   }

TestAccount 类:

    import java.util.Random;
    public class TestAccount {

    public static void main(String[] args) {

        Random ran = new Random();

        Account[] accountArray = new Account[5];
        Account acc1 = new OnLineAccount("Bill", 1000);
        Account acc2 = new OnLineAccount("Susan", 1500);
        Account acc3 = new SavingsAccount("William", 2500);
        Account acc4 = new SavingsAccount("Bill", 9000);
        Account acc5 = new SavingsAccount("Bruce", 1355);

        accountArray[0] = acc1;
        accountArray[1] = acc2;
        accountArray[2] = acc3;
        accountArray[3] = acc4;
        accountArray[4] = acc5;

        for(int i=0; i<accountArray.length; i++){
            System.out.println("Initial details of Account....");
            System.out.println(accountArray[i]);
            System.out.println("After some transactions..");
            accountArray[i].deposit(ran.nextInt(300));
            accountArray[i].withdrawl(ran.nextInt(3000
   ));
            System.out.println("Balance: "+accountArray[i].getBalance());
            System.out.println("After adding the interest for the year....");
            accountArray[i].addInterest();
            System.out.println("Balance: "+accountArray[i].getBalance());
            System.out.println(); // for blank line
        }

        System.out.println("Checking for Duplicates now....");
        for(int i=0; i<accountArray.length; i++){
            for(int j=0; j<i; j++){
                if(accountArray[i].equals(accountArray[j])){
                    System.out.println("Account "+accountArray[i].getAccountNo()+
                            " and "+accountArray[j].getAccountNo()+" are duplicates");
                }
            }
          }

       }

    }

我花了几个小时没有运气。任何帮助将非常感激。谢谢。 这是我在这里的第一篇文章。

我得到的输出是(帐号 12350 的余额为负数...):

【问题讨论】:

  • 只是说:这是一个很好的“第一个”问题。你提供了很多细节;很明显,您不希望我们为您做作业。尽管如此,显示测试程序的输出可能会有所帮助;并指出你得到意外结果的确切位置。还有另一个提示:您可能会考虑在错误场景中抛出异常(而不是打印到 stderr 并返回 false)。这有一个很大的优势:您的程序在第一个“错误情况”处就停在那里。
  • 同意 - 第一个问题很好。在我回答之前,我认为它可能是 - 当你输出跟随交易时 - 你直接调用accountArray[i].getBalance() - 绕过部分您警告toString() 中的无效余额/费用-我认为如果您再次使用accountArray[i].toString() 输出-您将看到警告消息。另外 - 一个提示 - 当你遇到你不理解的行为时 - 在你调试时临时用固定值替换随机值
  • 非常感谢@J Richard Snape 和 EddyG,在采纳了您的建议后,情况有所好转。

标签: java class


【解决方案1】:

负金额是可能的,因为您有一个高于一些人的初始存款金额的界限。

通过您的代码块中的存款和取款,您可以提取导致该人的余额为负数的金额。

accountArray[i].withdrawl(ran.nextInt(3000
            ));

【讨论】:

    【解决方案2】:

    感谢大家的帮助。它现在可以完美地显示所有错误消息。我按照 J Richard Snape 的建议在 getBalance() 之后添加了 toString(),现在一切正常。

    正如理查德所说,getBalance() 绕过了所有警告。

    现在输出:

    【讨论】:

      【解决方案3】:

      您的代码中可能出现负数。

      用一个在线帐户想象这个场景。

      罗伯特有 3000 美元。他提取了 2990 美元。只剩下 10 美元了。

      看到 10 美元低于最低金额,您减去 25 美元。 所以罗伯特的账户里会有 -15 美元。

      【讨论】:

      • 换句话说,您应该查看public boolean withdrawl(double amount) 函数。如果金额大于余额,你不应该让它退出
      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2017-12-22
      • 1970-01-01
      相关资源
      最近更新 更多