這兩天一直卡在這里灸眼,保存一個賬戶,總是在atm中要把賬號和密碼分別傳遞給bank,進(jìn)而觸發(fā)各種異常焰宣。
于是有了下面代碼的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判斷內(nèi)存是否還有空間
for(int i = 0;i < account.length;i++) {
if(account[i] == null) {
//account[i]的值為null
//2如果有,進(jìn)行存儲
//null 不能調(diào)用該對象的任何屬性和方法盅粪,否則引起Null.Point異常
//所以下邊的代碼是錯的
account[i].setName(name);
account[i].setPassword(password);
System.out.println("保存成功");
} else {
//3如果沒有,提示內(nèi)存已滿
System.out.println("用戶已滿础浮,請聯(lián)系銀行");
}
}
}
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異常奠骄,(當(dāng)然還有其他錯誤)所以有了第二版
V2
atm
private void creat() {
System.out.println("請輸入您的賬號");
String name = input.next();
//判斷bank中是否還有空間,有空間再提示進(jìn)一步輸入密碼進(jìn)行開戶
//暫未實現(xiàn)的功能(可以嘗試在最后一個空間被用戶開戶占用后就提示內(nèi)存滿了及時清理內(nèi)存)
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()方法的返回值設(shè)置成boolean類型戚揭,可以把判斷并輸出是否創(chuàng)建成功的語句轉(zhuǎn)移到在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;//跳出循環(huán)
}
}
return user;//跳出方法
}
這里bank好像義務(wù)做了點不屬于自己的工作,與用戶交流是atm的工作潜必,當(dāng)然這個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. 創(chuàng)建Account對象铝侵,傳到Bank中進(jìn)行保存
Account account = new Account();
account.setName(name);
account.setPassword(password);
boolean isSave = bank.save(account);
if(isSave) {
System.out.println("保存成功");
} else {
System.out.println("保存失敗,請聯(lián)系銀行");
}
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;
}
如果要存儲的一種(類)對象有多個屬性,設(shè)置一個包含這些屬性的屬性類猾警,在其他各個類和方法中依靠調(diào)用這個類來傳遞其內(nèi)部對象的各個屬性孔祸。
主角是這樣的
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;
}
}