Java 具有2个子类的银行帐户类未显示适当的错误消息

Java 具有2个子类的银行帐户类未显示适当的错误消息,java,class,Java,Class,我的学业需要帮助,我对编程非常陌生。因此,要求如下: 类帐户,将所有数据的可见性更改为受保护。更改提取方法,使其成为抽象方法。此操作需要将类声明为抽象类。存款在OnLineAccount和SavingsAccount中的工作方式应该相同,因此确保它们不能覆盖其父版本 OnLineAccount类比Account类有一个附加属性minimumBalance。创建的所有OnLineAccount实例的最小余额金额都设置为$500。如果任何在线账户的交易导致余额低于最低余额,则从账户余额中减去25美元

我的学业需要帮助,我对编程非常陌生。因此,要求如下:

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

OnLineAccount类比Account类有一个附加属性minimumBalance。创建的所有OnLineAccount实例的最小余额金额都设置为$500。如果任何在线账户的交易导致余额低于最低余额,则从账户余额中减去25美元的费用。覆盖
toString
方法以显示帐户
toString
显示的所有内容以及取决于余额的消息。如果余额低于最低余额,则需要向客户发送一条消息,说明已扣除25美元的费用。使用父类
toString
完成大部分工作

SavingsAccount类与Account类相比还有一个附加属性,即overdraft。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);
     } 


   }
导入java.text.NumberFormat;
导入java.util.Locale;
公共抽象类帐户{
私有静态int defaultAccountNo=12345;
受保护的字符串所有者;
受保护的国际帐户号;
保护双重平衡;
受保护帐户(字符串所有者,双重初始存储){
this.owner=所有者;
这个。余额=初始存款;
defaultAccountNo++;
this.accountNo=defaultAccountNo;
}
公共最终保证金(双倍金额){

如果(金额在您的代码中可能出现负金额

想象一下,这个场景中有一个在线帐户

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

鉴于10美元低于最低金额,你分包了25美元。
所以Robert的帐户上会有-15美元。

谢谢大家的帮助。它现在工作正常,所有错误消息都会显示出来。我按照J Richard Snape的建议在getBalance()之后添加了toString(),现在一切正常

正如Richard所说,getBalance()绕过了所有警告

现在输出:


可能出现负金额,因为您的存款额度高于某些人的初始存款额度

有了代码块中的存款和取款,您可以取款到一个金额,使此人的余额为负数

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

只是说:这是一个伟大的“第一”问题:你提供了很多细节;很明显,你不希望我们为你做家庭作业。然而,显示测试程序的输出可能是有帮助的,并指出你得到意外结果的确切地方。另外一个提示:你可能会考虑在你的错误场景中抛出一个异常。(而不是打印到stderr并返回false)。这有一个很大的优势:您的程序在第一个“错误情况”时就停止了。同意-第一个问题很好。在我回答之前,我想可能是这样的-当您在事务之后输出时-您直接调用
accountArray[I].getBalance()
-绕过您在
toString()中警告无效余额/费用的部分
-我认为如果您使用
accountArray[I].toString()输出
再次-您将看到您的警告消息。另外-一个提示-当您遇到不理解的行为时-在调试时暂时用固定值替换随机值非常感谢@J Richard Snape&EddyG,在应用您的建议后,情况有点好转。换句话说,您应该查看
公共布尔值取款(双倍金额)
功能。如果金额大于余额,则不应让其取款
 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();

      }

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

       }

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