尚硅谷 Java 基础实战—Bank 项目—实验题目 7(在6基础上修改)

简介: 尚硅谷 Java 基础实战—Bank 项目—实验题目 7(在6基础上修改)

实验题目

将建立一个 OverdraftException 异常,它由 Account 类的withdraw()方法抛出。

image.png

实验目的

自定义异常

提示

创建 OverdraftException 类

  1. 在 banking.domain 包中建立一个共有类 OverdraftException。这个类 扩展 Exception 类。
  2. 添加一个 double 类型的私有属性 deficit。增加一个共有访问方法 getDeficit。
  3. 添加一个有两个参数的共有构造器。deficit 参数初始化 deficit 属性。

修改 Account 类

  1. 重写 withdraw 方法使它不返回值(即 void)。声明方法抛出 overdraftException 异常。
  2. 修改代码抛出新异常,指明“资金不足”以及不足数额(当前余额扣除请求的数额)

修改 CheckingAccount 类。

  1. 重写 withdraw 方法使它不返回值(即 void)。声明方法抛出 overdraftException 异常。
  2. 修改代码使其在需要时抛出异常。两种情况要处理:
  3. 第一是存在没有透支保尚硅谷 Java 基础实战— Bank 项目 护的赤字,对这个异常使用 “no overdraft protection”信息。
  4. 第二是 overdraftProtection 数额不
  1. 足以弥补赤字:对 这 个 异常可使用 ”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代表交易成功,否则交易失败*/@Overridepublicvoidwithdraw(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());
    }
  }
}



目录
相关文章
|
3月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
3月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
289 119
|
4月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
1416 8
|
4月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
691 12
|
4月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
488 100
|
4月前
|
IDE 安全 Java
Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
215 1
|
4月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
482 0
|
4月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
4月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
470 1
|
5月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。