进阶day05-自定义异常-银行案例
This commit is contained in:
52
javaSE-day05/src/com/inmind/custom_exception06/Account.java
Normal file
52
javaSE-day05/src/com/inmind/custom_exception06/Account.java
Normal file
@@ -0,0 +1,52 @@
|
||||
package com.inmind.custom_exception06;
|
||||
|
||||
//账户类
|
||||
public class Account {
|
||||
String id;//账户ID
|
||||
String name;
|
||||
double balance;
|
||||
int pwdErrors;//密码输错次数
|
||||
boolean locked;//是否是锁定状态
|
||||
|
||||
static final int MAX_PWD_ERROR = 3;//最大密码错误次数
|
||||
static final String PWD = "123456";//默认密码
|
||||
|
||||
public Account(String id, String name, double balance) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.balance = balance;
|
||||
}
|
||||
|
||||
//存款功能
|
||||
public void saveMoney(double balance) throws AccountLockedException, InvalidAmountException {
|
||||
if (this.locked) {
|
||||
throw new AccountLockedException("账户"+this.id+"已锁定");
|
||||
}
|
||||
if (balance <= 0) {
|
||||
throw new InvalidAmountException("存款必须大于0");
|
||||
}
|
||||
this.balance += balance;
|
||||
System.out.println(this.name+"存了"+balance+"元,当前余额为"+this.balance+"元");
|
||||
}
|
||||
|
||||
// 取款
|
||||
public void getMoney(double amount, String pwd) throws Exception {
|
||||
if (locked) throw new AccountLockedException("账户" + id + "已锁定");
|
||||
// 密码验证
|
||||
if (!PWD.equals(pwd)) {
|
||||
pwdErrors++;
|
||||
System.out.println("pwdErrors的值" + pwdErrors);
|
||||
if (pwdErrors >= MAX_PWD_ERROR) {
|
||||
locked = true;
|
||||
throw new AccountLockedException("密码错误3次,账户" + id + "已锁定");
|
||||
}
|
||||
throw new Exception("密码错误,剩余次数:" + (MAX_PWD_ERROR - pwdErrors));
|
||||
}
|
||||
if (amount <= 0) throw new InvalidAmountException("取款金额必须大于0");
|
||||
if (amount > balance) throw new NotEnoughException("余额不足,当前余额:" + balance);
|
||||
balance -= amount;
|
||||
System.out.println(name + "取款" + amount + "元,当前余额:" + balance);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.inmind.custom_exception06;
|
||||
// 自定义异常3:账户锁定异常
|
||||
public class AccountLockedException extends Exception{
|
||||
public AccountLockedException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
45
javaSE-day05/src/com/inmind/custom_exception06/Bank.java
Normal file
45
javaSE-day05/src/com/inmind/custom_exception06/Bank.java
Normal file
@@ -0,0 +1,45 @@
|
||||
package com.inmind.custom_exception06;
|
||||
|
||||
// 银行类
|
||||
class Bank {
|
||||
private Account[] accounts; // 账户数组
|
||||
private int count; // 账户数量
|
||||
private static final double MAX_TRANSFER = 50000; // 单笔最大转账额
|
||||
|
||||
// 构造方法
|
||||
public Bank(int size) {
|
||||
accounts = new Account[size];
|
||||
count = 0;
|
||||
}
|
||||
|
||||
// 创建账户
|
||||
public void addAccount(Account acc) {
|
||||
if (count < accounts.length) {
|
||||
accounts[count++] = acc;
|
||||
System.out.println("创建账户成功:" + acc.id + "(" + acc.name + ")");
|
||||
}
|
||||
}
|
||||
|
||||
// 查找账户
|
||||
public Account findAccount(String id) throws Exception {
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (accounts[i].id.equals(id)) {
|
||||
return accounts[i];
|
||||
}
|
||||
}
|
||||
throw new Exception("账户" + id + "不存在");
|
||||
}
|
||||
|
||||
// 转账
|
||||
public void transferMoney(String fromId, String toId, double amount, String pwd) throws Exception {
|
||||
Account from = findAccount(fromId);
|
||||
Account to = findAccount(toId);
|
||||
|
||||
if (amount <= 0) throw new InvalidAmountException("转账金额必须大于0");
|
||||
if (amount > MAX_TRANSFER) throw new TransferLimitException("超过最大转账额" + MAX_TRANSFER);
|
||||
|
||||
from.getMoney(amount, pwd); // 先取款
|
||||
to.saveMoney(amount); // 再存款
|
||||
System.out.println("从" + from.name + "向" + to.name + "转账" + amount + "元成功");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.inmind.custom_exception06;
|
||||
// 自定义异常2:无效金额异常
|
||||
public class InvalidAmountException extends Exception{
|
||||
public InvalidAmountException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.inmind.custom_exception06;
|
||||
|
||||
//余额不足异常
|
||||
public class NotEnoughException extends Exception{
|
||||
public NotEnoughException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
82
javaSE-day05/src/com/inmind/custom_exception06/Test12.java
Normal file
82
javaSE-day05/src/com/inmind/custom_exception06/Test12.java
Normal file
@@ -0,0 +1,82 @@
|
||||
package com.inmind.custom_exception06;
|
||||
|
||||
import java.sql.SQLOutput;
|
||||
|
||||
/*
|
||||
自定义异常(4 个):
|
||||
NotEnoughException:余额不足时抛出
|
||||
InvalidAmountException:金额为负数或零时抛出
|
||||
AccountLockedException:账户锁定时抛出
|
||||
TransferLimitException:转账超过限额时抛出
|
||||
|
||||
核心功能:
|
||||
存款:验证账户状态和金额有效性
|
||||
取款:验证密码(3 次错误锁定)、金额和余额
|
||||
转账:校验双方账户、金额和限额,包含取款 + 存款原子操作
|
||||
|
||||
业务规则:
|
||||
密码错误 3 次自动锁定账户
|
||||
单笔转账上限 5000 元
|
||||
不允许负金额交易
|
||||
锁定账户无法进行任何操作
|
||||
*/
|
||||
public class Test12 {
|
||||
public static void main(String[] args) {
|
||||
Bank bank = new Bank(10);
|
||||
try {
|
||||
// 创建账户
|
||||
bank.addAccount(new Account("1001", "张三", 10000));
|
||||
bank.addAccount(new Account("1002", "李四", 5000));
|
||||
|
||||
Account zhang = bank.findAccount("1001");
|
||||
// 正常操作
|
||||
zhang.saveMoney(2000);
|
||||
zhang.getMoney(3000, "123456");
|
||||
|
||||
// 测试异常场景
|
||||
try {
|
||||
zhang.getMoney(20000, "123456");
|
||||
} // 余额不足
|
||||
catch (NotEnoughException e) {
|
||||
System.out.println("异常:" + e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
bank.transferMoney("1001", "1002", 60000, "123456");
|
||||
} // 转账超限
|
||||
catch (TransferLimitException e) {
|
||||
System.out.println("异常:" + e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
zhang.getMoney(1000, "111");
|
||||
} // 密码错误
|
||||
catch (Exception e) {
|
||||
System.out.println("异常:" + e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
zhang.getMoney(1000, "111");
|
||||
} // 锁定账户
|
||||
catch (Exception e) {
|
||||
System.out.println("异常:" + e.getMessage());
|
||||
}
|
||||
try {
|
||||
zhang.getMoney(1000, "111");
|
||||
} // 锁定账户
|
||||
catch (AccountLockedException e) {
|
||||
System.out.println("异常:" + e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
zhang.getMoney(1000, "111");
|
||||
} // 锁定账户
|
||||
catch (AccountLockedException e) {
|
||||
System.out.println("异常:" + e.getMessage());
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("系统错误:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.inmind.custom_exception06;
|
||||
|
||||
// 自定义异常4:转账超限异常
|
||||
public class TransferLimitException extends Exception{
|
||||
public TransferLimitException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user