这两天一直卡在这里,保存一个账户,总是在atm中要把账号和密码分别传递给bank,进而触发各种异常。
于是有了下面代码的V1、V2、V3版
V1
atm
public class ATM {
private java.util.Scanner input = new java.util.Scanner(System.in);
private Bank bank = new Bank();
private void creat() {
//1提示输入账户名称
System.out.println("请输入账号");
String name = input.next();
//2在Bank中查询账号是否被占用
boolean result = bank.findByName(name);
//3如果未被占用提示输入密码
if(result) {
System.out.println("请输入密码");
String password = input.next();
//4在Bank中保存
bank.save(name,password);
} else {
System.out.println("该账户已存在");
creat();
}
}
}
bank
public class Bank {
private Account[] account = new Account[10];
public void save(String name,String password) {
//1判断内存是否还有空间
for(int i = 0;i < account.length;i++) {
if(account[i] == null) {
//account[i]的值为null
//2如果有,进行存储
//null 不能调用该对象的任何属性和方法,否则引起Null.Point异常
//所以下边的代码是错的
account[i].setName(name);
account[i].setPassword(password);
System.out.println("保存成功");
} else {
//3如果没有,提示内存已满
System.out.println("用户已满,请联系银行");
}
}
}
public boolean findByName(String name) {
boolean result = true;
for(int i = 0;i < account.length;i++) {
if(name.equals(account[i])) {
result = false;
break;
}
}
return result;
}
}
完美引起Null.Point异常,(当然还有其他错误)所以有了第二版
V2
atm
private void creat() {
System.out.println("请输入您的账号");
String name = input.next();
//判断bank中是否还有空间,有空间再提示进一步输入密码进行开户
//暂未实现的功能(可以尝试在最后一个空间被用户开户占用后就提示内存满了及时清理内存)
if(bank.findByName(name) == null) {
System.out.println("请输入您的密码:");
String pass = input.next();
User user = new User();
user.setName(name);
user.setPass(pass);
bank.save(user);
//!!!!这里把bank.save()方法的返回值设置成boolean类型,可以把判断并输出是否创建成功的语句转移到在ATM中
go();
} else {
System.out.println("该账户已存在请重新输入");
creat();
}
}
bank
public void save(User user) {
boolean flag = true;
for(int i = 0;i < users.length;i++) {
if(users[i] == null) {
users[i] = user;
flag = false;
System.out.println("开户成功");
break;
}
}
if(flag) {
System.out.println("用户已满,暂无法开户");
} else {
System.out.println("开户成功");
}
}
public User findByName(String name) {
User user = null;
for(int i = 0;i < users.length; i++) {
if(users[i] != null && name.equals(users[i].getName())) {
user = users[i];
break;//跳出循环
}
}
return user;//跳出方法
}
这里bank好像义务做了点不属于自己的工作,与用户交流是atm的工作,当然这个bank任劳任怨,一套流程也能正常运行,但是时间长了,难免要出意外,所以第三版来了,各司其职。
V3
atm
private void createAccount() {
//1. 让用户输入账号
System.out.println("请输入你要开户的账号:");
String name = input.next();
//2. 去Bank查看该账号是否被占用
Account acc = bank.findByName(name);
if(acc == null) {
//2.2 如果可用,则提示密码
System.out.println("请输入密码:");
String password = input.next();
//3. 创建Account对象,传到Bank中进行保存
Account account = new Account();
account.setName(name);
account.setPassword(password);
boolean isSave = bank.save(account);
if(isSave) {
System.out.println("保存成功");
} else {
System.out.println("保存失败,请联系银行");
}
startup();
} else {
//2.1 如果被占用提示重新输入
System.out.println("该账号已被占用,请重新输入");
createAccount();
}
}
bank
public boolean save(Account account) {
boolean flag = false;
for(int i = 0 ;i < dataBase.length;i++) {
if(dataBase[i] == null) {
flag = true;
dataBase[i] = account;
break;
}
}
return flag;
}
public Account findByName(String name) {
for(int i = 0;i < dataBase.length;i++) {
if(dataBase[i] != null && name.equals(dataBase[i].getName())) {
return dataBase[i];
}
}
return null;
}
如果要存储的一种(类)对象有多个属性,设置一个包含这些属性的属性类,在其他各个类和方法中依靠调用这个类来传递其内部对象的各个属性。
主角是这样的
Account
V2中用User代表这里的Account
public class Account {
private String name;
private String password;
private int money;
private boolean enable = true;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
}
}