how2j.cn

步骤 1 : 练习-异常综合1   
步骤 2 : 答案-异常综合1   
步骤 3 : 练习-异常综合2   
步骤 4 : 答案-异常综合2   

步骤 1 :

练习-异常综合1

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
这是一个类图
Account类: 银行账号
属性: balance 余额
方法: getBalance() 获取余额
方法: deposit() 存钱
方法: withdraw() 取钱
OverdraftException: 透支异常,继承Exception
属性: deficit 透支额
练习-异常综合1
步骤 2 :

答案-异常综合1

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

5分18秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package exception; public class Account { protected double balance; public Account(double balance) { this.balance = balance; } public double getBalance() { return balance; } public void deposit(double amt){ this.balance+=amt; } public void withdraw(double amt) throws OverDraftException{ if(this.balance<amt) throw new OverDraftException("余额不足", amt-this.balance); this.balance-=amt; } public static void main(String[] args) { //开户存了1000 Account a = new Account(1000); //存钱1000 a.deposit(1000); //查看余额 System.out.println(a.getBalance()); try { //取2001 a.withdraw(2001); } catch (OverDraftException e) { System.err.println("透支金额:"+e.getDeficit()); e.printStackTrace(); } } }
package exception; public class OverDraftException extends Exception{ private double deficit; public double getDeficit() { return deficit; } public OverDraftException(String msg, double deficit) { super(msg); this.deficit = deficit; } }
步骤 3 :

练习-异常综合2

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
类: CheckingAccount 支票账户,具备透支额度,继承Account
属性:overdraftProtection 透支额度
练习-异常综合2
步骤 4 :

答案-异常综合2

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

4分41秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package exception; public class CheckingAccount extends Account { private double overdraftProtection; public CheckingAccount(double balance) { super(balance); } public CheckingAccount(double balance, double overdraftProtection) { super(balance); this.overdraftProtection = overdraftProtection; } public void withdraw(double amt) throws OverDraftException { if (amt > this.balance + overdraftProtection) { double deficit = amt - (this.balance + overdraftProtection); throw new OverDraftException("透支额度超标", deficit); } this.balance -= amt; } public static void main(String[] args) { //开户存了1000块,拥有500的透支额度 CheckingAccount a = new CheckingAccount(1000, 500); //存了1000 a.deposit(1000); //查询余额 System.out.println(a.getBalance()); try { a.withdraw(600); System.out.println(a.getBalance()); a.withdraw(600); System.out.println(a.getBalance()); a.withdraw(600); System.out.println(a.getBalance()); a.withdraw(600); System.out.println(a.getBalance()); a.withdraw(600); System.out.println(a.getBalance()); } catch (OverDraftException e) { System.err.println("透支超额:"+e.getDeficit()); e.printStackTrace(); } } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-05 一种更严谨和更合理的方式实现支票和账户的功能
虚心求学




示例题目只考虑了超额取钱使用透支额度的情况,而存钱时,透支额度没有相应地增加。比如余额10元,透支额度为100元;用户取了110元后,余额变为 10-110 = -100元,剩余透支额度为0元,也就是用户借了100元;那后来,用户继续存了200元,是不是就还钱了欠款,余额变为 -100+200 = 100元,剩余透支额度为0元。很显然,只考虑使用额度的话,现在用户的透支额度是不是也还是0元,那是不是意味着只要用户欠了钱,用完了额度,以后无论还没还钱、存进去多少钱,额度还是不会变化,永远也借不了钱(不能透支),这样就不合理了。 因此为了增加合理性,应该在用户存钱/还钱的时候,相应地增加透支额度,就像花呗那样更加合理。 详细见代码,思路如下: 按照逻辑 1、用户准备取的钱大于余额,意味着开始透支(欠钱),当准备透支的钱大于透支额度则抛出异常,无法继续取钱/透支。 而透支又有两种情况: (1)当前未欠钱,刚开始透支; 判断方法,判断当前余额是否小于0,大于0则意味着当前未欠钱。 此时,用户准备取的钱又大于剩余的额度(刚准备透支),比如剩10元,准备取100元,就意味着开始透支了。 用户此时 准备透支的金额 =(打算取钱的金额) - (当前余额),比如准备取出100元,当前余额10元,意味着将继续透支 100-10 = 90元。 (2)之前已经欠过钱了,然后继续透支; 判断方法,判断当前余额是否小于0,小于0则意味着当前已经欠钱了。 此时无论用户打算取多少钱,都意味着继续欠钱,继续欠的钱(透支)的金额就等于当前打算取的钱的金额。比如:用户当前余额为 -10元,意味着已经欠(透支)了10元,然后打算继续取100元,那是不是意味着当前继续透支了100元。 2、当用户准备存钱,如果当前状态已经欠钱了,继续存钱就补充透支额度。 此时也有两种情况: (1)不够还清欠的额度; 判断方法,判断 打算存的金额 与 当前余额的绝对值 的大小,如果存的金额小于余额的绝对值,意味着全部存进去还是欠钱,只是少欠了一点。 比如:用户当前余额为-100,存进去99,是不是余额还是 -1,也就是还欠了一块钱,那么剩余额度是不是就是 当前额度+存的金额,比如当前剩余投资额度为0元,存了99元,剩余额度就补充到99元了。 (2)够还清欠的额度; 判断方法,如果存的金额大于余额的绝对值,意味着全部存进去足够还钱欠的额度了。 比如:用户当前余额为-100,存进去200元,余额变为100元。那么剩余额度是不是全部补满,比如原本剩余透支额度为0,存进去200,剩余透支额度就是100元了。剩余额度 = 当前额度+用户欠的钱的绝对值 = 0+Math.abs(-100) = 100元;
加载中
package MyExceptionTest;

public class CheckingAccount extends Account {
	private static CheckingAccount instance;
	private double overDraftProtection;
	private CheckingAccount(double init)
	{
		super(init);
	}
	private CheckingAccount(double init,double protect)
	{
		super(init);
		this.overDraftProtection = protect;
	}
	public static CheckingAccount getInstance(double init,double protect)
	{
		if(instance == null)
			instance = new CheckingAccount(init,protect);
		return instance;
	}
	
	//用户存钱
	@Override
	public void deposit(double amt)
	{
		if(amt<=0)return;
		double userWannaAdd = 0;					//用户本次准备补充的额度
		//是否欠费
		if(this.balance<0)
		{
			if(amt <= Math.abs(this.balance))		//不足以补满欠的额度
				userWannaAdd += amt;
			else									//足以补满所欠的额度
				userWannaAdd += Math.abs(this.balance);
		}
		//补充额度
		this.overDraftProtection+=userWannaAdd;
		//存钱
		this.balance+=amt;
	}
	
	//用户取钱
	@Override
	public void withdarw(double amt) throws OverdrafException
	{
		if(amt<=0)return;
		double userWannaMins = 0;					//用户本次准备透支的额度
		
		//计算用户本次透支额
		if(this.balance>=0 && amt>this.balance)		//余额大于0且取出的钱大于余额,即刚开始透支时
		{
			userWannaMins = amt-this.balance;		//本次透支的金额
		}
		else if(this.balance<0)						//余额小于零,即已经透支过,继续透支时
		{
			userWannaMins = amt;	
		}
		//检查本次透支额是否合理
		if(userWannaMins>this.overDraftProtection)	//用户本次透支的金额大于剩余的透支额度
		{
			throw new OverdrafException(String.format("透支异常,当前余额为 %.2f 元,"
					+ "你准备继续透支的金额( %.2f 元)不合理,当前透支额度剩余 %.2f 元", this.balance,userWannaMins,this.overDraftProtection));
		}
		else
		{
			overDraftProtection -= userWannaMins;	//剩余的透支额度减去本次透支的金额
			this.balance -= amt;					//取钱
		}
	}
	
	public double getOverDraftProtection()
	{
		return this.overDraftProtection;
	}
	@Override
	public String toString()
	{
		return String.format(" 当前账户余额为:%.2f ,剩余透支额:%.2f ",getBalance(),getOverDraftProtection());
	}

-----------------------------------下一个类(父类)-------------------------------------------

package MyExceptionTest;

public class Account {
	protected double balance;
	private static Account instance;
	protected Account(double init)
	{
		this.balance = init;
	}
	//使用懒汉单例模式获取实例
	public static Account getInstance(double init)
	{
		if(instance == null)
			instance = new Account(init);
		return instance;
	}
	public double getBalance(){
		return this.balance;
	}
	public void deposit(double amt)
	{
		if(amt<=0)return;
		
		this.balance+=amt;
	}
	public void withdarw(double amt) throws OverdrafException
	{
		if(amt<=0)return;
		if(this.balance<amt)throw new OverdrafException(String.format("透支异常,当前余额为 %.2f 元,"
				+ "你准备取出的金额不合理( %.2f 元),最大只能取( %.2f 元)", this.balance,amt,this.balance));
		else
		this.balance -= amt;
	}

}

-----------------------------------下一个类(异常类)-------------------------------------------

package MyExceptionTest;

public class OverdrafException extends Exception {

	private double deficit;
	public OverdrafException()
	{
		super();
	}
	public OverdrafException(String message)
	{
		super(message);
	}
	public double getDeficit()
	{
		return this.deficit;
	}
}

-----------------------------------下一个类(主方法类)-------------------------------------------

package MyExceptionTest;
public class MyTest {

	public static void main(String[] args) throws OverdrafException {
		// TODO Auto-generated method stub
		CheckingAccount myCheck = CheckingAccount.getInstance(0,100);
		System.out.println(myCheck);

		myCheck.deposit(10);
		System.out.println("存钱后,"+myCheck);
		
		
		myCheck.withdarw(10);
		System.out.println("取钱后,"+myCheck);
		myCheck.withdarw(100);System.out.println("取钱后,"+myCheck);
		myCheck.deposit(10);System.out.println("存钱后,"+myCheck);
		myCheck.withdarw(0.01);System.out.println("取钱后,"+myCheck);
                myCheck.withdarw(1000);System.out.println("取钱后,"+myCheck);     //异常抛出
		}

	}
Exception in thread "main" MyExceptionTest.OverdrafException: 透支异常,当前余额为 -90.01 元,你准备继续透支的金额( 1000.00 元)不合理,当前透支额度剩余 9.99 元
	at MyExceptionTest.CheckingAccount.withdarw(CheckingAccount.java:61)
	at MyExceptionTest.MyTest.main(MyTest.java:18)


1 个答案

虚心求学
答案时间:2024-07-05
作者水平有限,恳请各位批评指正



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-09-03 支票账户答案
logiczqr




如题
package exception;

public class CheckingAccount extends Account{
	double overdraftProtection;
	public CheckingAccount(double balance) {
		super(balance);
	}
	public CheckingAccount(double balance,double protect) {
		// TODO Auto-generated constructor stub
		super(balance);
		this.overdraftProtection=protect;
	}
	public void withdraw(double amt) throws OverdrafException{
		if (amt>balance+overdraftProtection) {
			double deficit=amt-(balance+overdraftProtection);
			throw new OverdrafException("透支超标",deficit);
		}else if (amt<balance+overdraftProtection&&amt>balance) {
			overdraftProtection-=(amt-balance);
			balance=0;
		}else if (amt==(balance+overdraftProtection)) {
			balance=0;
			overdraftProtection=0;
		}else {
			balance-=amt;
		}
		System.out.println("取钱"+amt+",余额剩余:"+balance+",透支额度剩余:"+overdraftProtection);
	}
	public  double getOver() {
		return overdraftProtection;
	}
	public static void main(String[] args) {
		CheckingAccount ca=new CheckingAccount(1000, 500);
		ca.deposit(2000);
		System.out.println("账户余额:"+ca.getBalance()+",透支额度:"+ca.getOver());
		try {
			ca.withdraw(3499);
		} catch (OverdrafException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage()+",超额:"+e.getDeficit());
		}
	}
}

							


3 个答案

夜无忧
答案时间:2024-07-01
public class Account { private double balance; public Account(){ } // public void setBalance(double balance){ // this.balance = balance; // // } public double getBalance(){ return balance; } public Boolean deposit(double leave){ balance +=leave; return true; } public Boolean withdraw(double leave)throws OverdraftException{ if(leave>balance){ throw new OverdraftException("你没钱啦!",leave-balance); } balance -=leave; return true; } public static void main(String[]args){ // Account account = new Account(); // account.deposit(2000); // try{ // account.withdraw(3000); // }catch (OverdraftException e){ // System.out.println("透支金额:"+e.getDeficit()); // e.printStackTrace(); // } CheckingAccount checkingAccount = new CheckingAccount(2000,3000); try { checkingAccount.withdraw(8000); }catch (OverdraftException e){ System.out.println("超支金额:"+e.getDeficit()); e.printStackTrace(); } } } class CheckingAccount extends Account{ private double overdraftProtection; private double balance; public CheckingAccount(double balance){ this.balance = balance; } public CheckingAccount(double balance,double protect){ this.balance = balance; this.overdraftProtection = protect; } @Override public Boolean withdraw(double leave) throws OverdraftException { if(balance<leave && leave-balance<overdraftProtection){ balance -=leave; System.out.println("您已透支,余额为:"+balance); return true; }else if (balance<leave && leave-balance>overdraftProtection){ throw new OverdraftException("你超支啦!",leave-(balance+overdraftProtection)); }else { balance -=leave; return true; } } } class OverdraftException extends Exception { private double deficit; public OverdraftException(String message,double deficit){ super(message); this.deficit = deficit; } public double getDeficit(){ return deficit; } }

RobertLewandowski9
答案时间:2023-09-26
存入99.0 当前余额为2122.0 取出99999.0 对不起,已透支,透支额为97877.0

LUO萝北
答案时间:2023-05-13
public class Account { private static double balance; public static double getBalance() { return balance; } public static void deposit(double in) { balance+=in; } public static void withdraw(double wd) { balance-=wd; } } class OverdraftException extends Exception{ public OverdraftException() {} public OverdraftException(String gripe) { super(gripe); } }



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-09-03 银行账号答案
2022-05-12 答案
2021-09-04 答: 练习1,练习2


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 31 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-异常处理-综合练习 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图