实验题目
将建立一个 OverdraftException 异常,它由 Account 类的withdraw()方法抛出。
实验目的
自定义异常
提示
创建 OverdraftException 类
- 在 banking.domain 包中建立一个共有类 OverdraftException。这个类 扩展 Exception 类。
- 添加一个 double 类型的私有属性 deficit。增加一个共有访问方法 getDeficit。
- 添加一个有两个参数的共有构造器。deficit 参数初始化 deficit 属性。
修改 Account 类
- 重写 withdraw 方法使它不返回值(即 void)。声明方法抛出 overdraftException 异常。
- 修改代码抛出新异常,指明“资金不足”以及不足数额(当前余额扣除请求的数额)
修改 CheckingAccount 类。
- 重写 withdraw 方法使它不返回值(即 void)。声明方法抛出 overdraftException 异常。
- 修改代码使其在需要时抛出异常。两种情况要处理:
- 第一是存在没有透支保尚硅谷 Java 基础实战— Bank 项目 护的赤字,对这个异常使用 “no overdraft protection”信息。
- 第二是 overdraftProtection 数额不
- 足以弥补赤字:对 这 个 异常可使用 ”Insufficient funds for overdraft protection” 信息 。
编译并运行 TestBanking 程序,看到下列输入结果:
Customer [Simms, Jane] hasacheckingbalanceof200.0witha500.00overdraftprotection. CheckingAcct [JaneSimms] : withdraw150.00CheckingAcct [JaneSimms] : deposit22.50CheckingAcct [JaneSimms] : withdraw147.62CheckingAcct [JaneSimms] : withdraw470.00Exception: InsufficientfundsforoverdraftprotectionDeficit: 470.0Customer [Simms, Jane] hasacheckingbalanceof0.0Customer [Bryant, Owen] hasacheckingbalanceof200.0CheckingAcct [OwenBryant] : withdraw100.00CheckingAcct [OwenBryant] : deposit25.00CheckingAcct [OwenBryant] : withdraw175.00Exception: nooverdraftprotectionDeficit: 50.0Customer [Bryant, Owen] hasacheckingbalanceof125.0
代码
【Account.java】类
packagebanking; importbanking.domain.OverdraftException; publicclassAccount { protecteddoublebalance; //银行帐户的当前(或即时)余额//公有构造器 ,这个参数为 balance 属性赋值publicAccount(doubleinit_balance) { this.balance=init_balance; } //用于获取经常余额publicdoublegetBalance() { returnbalance; } /*** 向当前余额增加金额* @param amt 增加金额* @return 返回 true(意味所有存款是成功的)*/publicbooleandeposit(doubleamt){ balance+=amt; returntrue; } /*** 从当前余额中减去金额* @param amt 提款数目* @return 如果 amt小于 balance, 则从余额中扣除提款数目并返回 true,否则余额不变返回 false。*/publicvoidwithdraw(doubleamt) throwsOverdraftException { if (amt<balance){ balance-=amt; }else{ thrownewOverdraftException("资金不足",balance-amt); } } }
【Customer.java】类
packagebanking; publicclassCustomer { privateStringfirstName; privateStringlastName; privateAccount[] accounts=newAccount[10]; privateintnumOfAccounts; publicCustomer(Stringf, Stringl) { this.firstName=f; this.lastName=l; } publicStringgetFirstName() { returnfirstName; } publicStringgetLastName() { returnlastName; } /*** 通过下标索引获取 account* @param index 下标索引* @return account*/publicAccountgetAccount(intindex) { returnaccounts[index]; } /*** 获取 numOfAccounts* @return numOfAccounts*/publicintgetNumOfAccounts() { returnnumOfAccounts; } /*** 添加 account,并将 numOfAccounts+1* @param acct account*/publicvoidaddAccount(Accountacct) { accounts[numOfAccounts++]=acct; } }
【Bank.java】类
packagebanking; /*** 银行类*/publicclassBank { privateCustomer[] customers; //Customer对象的数组privateintnumberOfCustomer; //整数,跟踪下一个 customers 数组索引privatestaticBankbankInstance=null; /*** getBanking 的公有静态方法,它返回一个 Bank 类的实例。* @return 返回一个 Bank 类的实例。*/publicstaticBankgetBank(){ if(bankInstance==null){ bankInstance=newBank(); } returnbankInstance; } /*** 单例模式中构造器也应该是私有的,以合适的最大尺寸(至少大于 5)初始化 customers 数组。*/privateBank() { customers=newCustomer[10]; } /*** 该方法必须依照参数(姓,名)构造一个新的 Customer 对象然后把它放到 customer 数组中。还必须把 numberOfCustomers 属性的值加 1。* @param f 姓* @param l 名*/publicvoidaddCustomer(Stringf,Stringl){ customers[numberOfCustomer++]=newCustomer(f,l); } /*** 通过下标索引获取 customer* @param index 下标索引* @return customer*/publicCustomergetCustomer(intindex) { returncustomers[index]; } publicintgetNumOfCustomers() { returnnumberOfCustomer; } }
【CheckingAccount.java】类
packagebanking; importbanking.domain.OverdraftException; publicclassCheckingAccountextendsAccount{ privatedoubleoverdraftProtection; publicCheckingAccount(doublebalance) { super(balance); } publicCheckingAccount(doublebalance, doubleprotect) { super(balance); this.overdraftProtection=protect; } /*** 此方法必须执行下列检查。如 果当前余额足够弥补取款 amount,则正常进行。* 如果不够弥补但是存在透支保护,则尝试用 overdraftProtection 得值来弥补该差值(balance-amount).* 如果弥补该透支所需要的金额大于当前的保护级别。则整个交易失败,但余额未受影响。* @param amt 提款数目* @return 返回true代表交易成功,否则交易失败*/publicvoidwithdraw(doubleamt) throwsOverdraftException { if (balance<amt){ if(overdraftProtection==0){ thrownewOverdraftException("no overdraft protection",amt-balance); } if (amt-balance>overdraftProtection) { thrownewOverdraftException("Insufficient funds for overdraft protection",amt); }else { overdraftProtection-=amt-balance; balance=0; } }else { balance-=amt; } } }
【SavingsAccount.java】类
packagebanking; publicclassSavingsAccountextendsAccount{ privatedoubleinterestRate; publicSavingsAccount(doublebalance, doubleinterest_Rate) { super(balance); this.interestRate=interest_Rate; } }
【CustomerReport.java】类
packagebanking.reports; importbanking.Account; importbanking.Bank; importbanking.Customer; importbanking.SavingsAccount; publicclassCustomerReport { /*** 客户报告,Generate a report*/publicstaticvoidgeneralReport(){ Bankbank=Bank.getBank(); System.out.println("\t\t\tCUSTOMERS REPORT"); System.out.println("\t\t\t================"); for (intcust_idx=0; cust_idx<bank.getNumOfCustomers(); cust_idx++) { Customercustomer=bank.getCustomer(cust_idx); System.out.println(); System.out.println("Customer: "+customer.getLastName() +", "+customer.getFirstName()); for (intacct_idx=0; acct_idx<customer.getNumOfAccounts(); acct_idx++) { Accountaccount=customer.getAccount(acct_idx); Stringaccount_type=""; // Determine the account type/*** Step 1:**** Use the instanceof operator to test what type of account**** we have and set account_type to an appropriate value, such**** as "Savings Account" or "Checking Account".***/if (accountinstanceofSavingsAccount) { account_type="Savings Account"; } else { account_type="Checking Account"; } // Print the current balance of the account/*** Step 2:**** Print out the type of account and the balance.**** Feel free to use the currency_format formatter**** to generate a "currency string" for the balance.***/System.out.println("\t"+account_type+": current balance is ¥"+account.getBalance()); } } } }
【OverdraftException.java】类
packagebanking.domain; /*** 自定义异常类*/publicclassOverdraftExceptionextendsException{ privatedoubledeficit; publicOverdraftException(Stringmessage, doubledeficit) { super(message); this.deficit=deficit; } publicdoublegetDeficit() { returndeficit; } }
【TestBanking.java】类
packagebanking;/** This class creates the program to test the banking classes.* It creates a set of customers, with a few accounts each,* and generates a report of current account balances.*/importbanking.domain.*; publicclassTestBanking { publicstaticvoidmain(String[] args) { Bankbank=Bank.getBank(); Customercustomer; Accountaccount; // Create two customers and their accountsbank.addCustomer("Jane", "Simms"); customer=bank.getCustomer(0); customer.addAccount(newSavingsAccount(500.00, 0.05)); customer.addAccount(newCheckingAccount(200.00, 500.00)); bank.addCustomer("Owen", "Bryant"); customer=bank.getCustomer(1); customer.addAccount(newCheckingAccount(200.00)); // Test the checking account of Jane Simms (with overdraft protection)customer=bank.getCustomer(0); account=customer.getAccount(1); System.out.println("Customer ["+customer.getLastName() +", "+customer.getFirstName() +"]"+" has a checking balance of "+account.getBalance() +" with a 500.00 overdraft protection."); try { System.out.println("Checking Acct [Jane Simms] : withdraw 150.00"); account.withdraw(150.00); System.out.println("Checking Acct [Jane Simms] : deposit 22.50"); account.deposit(22.50); System.out.println("Checking Acct [Jane Simms] : withdraw 147.62"); account.withdraw(147.62); System.out.println("Checking Acct [Jane Simms] : withdraw 470.00"); account.withdraw(470.00); } catch (OverdraftExceptione1) { System.out.println("Exception: "+e1.getMessage() +" Deficit: "+e1.getDeficit()); } finally { System.out.println("Customer ["+customer.getLastName() +", "+customer.getFirstName() +"]"+" has a checking balance of "+account.getBalance()); } System.out.println(); // Test the checking account of Owen Bryant (without overdraft protection)customer=bank.getCustomer(1); account=customer.getAccount(0); System.out.println("Customer ["+customer.getLastName() +", "+customer.getFirstName() +"]"+" has a checking balance of "+account.getBalance()); try { System.out.println("Checking Acct [Owen Bryant] : withdraw 100.00"); account.withdraw(100.00); System.out.println("Checking Acct [Owen Bryant] : deposit 25.00"); account.deposit(25.00); System.out.println("Checking Acct [Owen Bryant] : withdraw 175.00"); account.withdraw(175.00); } catch (OverdraftExceptione1) { System.out.println("Exception: "+e1.getMessage() +" Deficit: "+e1.getDeficit()); } finally { System.out.println("Customer ["+customer.getLastName() +", "+customer.getFirstName() +"]"+" has a checking balance of "+account.getBalance()); } } }