ATM机的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0)。 模拟ATM的功能设计,用户插卡后显示选择语言界面,输入密码界面,用户输入正确密码(用户输入错误密码,则提示该卡已被锁定,无法操作),则弹出选择界面:存款、取款、转账汇款、修改密码、查询余额。 选择“取款”,则显示100元、500元、1000元、1500元、2000元、5000元、其他金额、退卡、返回操作供用户选择; 选择“存款”,则提示用户输入存款金额,修改余额; 选择“转账”,则提示用户输入转账行号、转账金额,并提示转账成功。
要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃。 自定义如下异常类,并在程序中验证: 取款时输入非整数时,抛出 “数字格式异常”,提示信息为“请输入正确的数字”; 如果输入数字非100的整倍数时,抛出“数字录入异常”,提示信息为“录入错误,请输出100的整数倍”; 三次密码输入错误,抛出“锁卡异常”,提示信息自定义。
1 import java.util.*; 2 public class ShowATM { 3 @SuppressWarnings({ "resource", "unused" }) 4 public static void main(String[] args) throws NumberErrorException { 5 Scanner in=new Scanner(System.in); 6 PATM atm=new ATM(); 7 NumberErrorException nee=new NumberErrorException("输入非法!"); 8 NotHundredTimesException nhte=new NotHundredTimesException("不是一百的整数倍!"); 9 PasswordErrorException pee=new PasswordErrorException("输入错误的密码超过三次!"); 10 int passwordErrorTimes=0; 11 int choose=-1,number=0,x=0; 12 String num=""; 13 String pw=""; 14 next:while(true){ 15 System.out.println("是否进入账户(0否1是):"); 16 int kk=-1; 17 String c=in.next(); 18 if(whetherNum(c)) 19 kk=Integer.parseInt(c); 20 if(kk==0) break; 21 else if(kk!=1){ 22 System.out.println("输入错误!"); 23 continue; 24 } 25 System.out.println("输入账户密码:"); 26 pw=in.next(); 27 if(atm.ifPass(pw)){ 28 while(true){ 29 showFace(); 30 String cc=in.next(); 31 if(whetherNum(cc)) 32 choose=Integer.parseInt(cc); 33 switch(choose){ 34 case 1: 35 System.out.println("输入存款金额:"); 36 while(true){ 37 try{ 38 num=in.next(); 39 if(!whetherNum(num)) 40 throw nee; 41 else if((x=Integer.parseInt(num)%100)!=0) 42 throw nhte; 43 else 44 break; 45 } 46 catch(NumberErrorException e){ 47 System.out.println("输入正确的数字!"); 48 } 49 catch(NotHundredTimesException e){ 50 System.out.println("录入错误,请输入合法的整数(100的整数倍)!"); 51 } 52 } 53 number=Integer.parseInt(num); 54 atm.save(number); 55 System.out.println("存款成功!"); 56 System.out.println("当前余额:"+atm.getRest()+"元"); 57 break; 58 case 2: 59 System.out.println("请选择:"); 60 int a[]={100,500,1000,1500,2000,5000}; 61 for(int i=0;i<a.length;i++) 62 System.out.println((i+1)+"."+a[i]+"元"); 63 System.out.println("7.其他"); 64 String bb=""; 65 int ch=-1; 66 bb=in.next(); 67 if(whetherNum(bb)){ 68 ch=Integer.parseInt(bb); 69 } 70 if(ch>=1&&ch<=6){ 71 if(atm.withdraw(a[ch-1])) 72 System.out.println("取款成功!"); 73 else 74 System.out.println("余额不足!"); 75 } 76 else if(ch==7){ 77 System.out.println("请输入取款金额:"); 78 while(true){ 79 try{ 80 num=in.next(); 81 if(!whetherNum(num)) 82 throw nee; 83 else if((x=Integer.parseInt(num)%100)!=0) 84 throw nhte; 85 else 86 break; 87 } 88 catch(NumberErrorException e){ 89 System.out.println("输入正确的数字!"); 90 } 91 catch(NotHundredTimesException e){ 92 System.out.println("录入错误,请输入合法的整数(100的整数倍)!"); 93 } 94 } 95 number=Integer.parseInt(num); 96 if(atm.withdraw(number)) 97 System.out.println("取款成功!"); 98 else 99 System.out.println("余额不足!"); 100 } 101 else 102 System.out.println("输入有误!"); 103 System.out.println("当前余额:"+atm.getRest()+"元"); 104 break; 105 case 3: 106 System.out.println("账户号:"); 107 String s=in.next(); 108 System.out.println("转账金额:"); 109 while(true){ 110 try{ 111 num=in.next(); 112 if(!whetherNum(num)) 113 throw nee; 114 else if((x=Integer.parseInt(num)%100)!=0) 115 throw nhte; 116 else 117 break; 118 } 119 catch(NumberErrorException e){ 120 System.out.println("输入正确的数字!"); 121 } 122 catch(NotHundredTimesException e){ 123 System.out.println("录入错误,请输入合法的整数(100的整数倍)!"); 124 } 125 } 126 number=Integer.parseInt(num); 127 if(atm.transfer(s, number)) 128 System.out.println("转账成功!"); 129 else 130 System.out.println("转账失败!"); 131 System.out.println("当前余额:"+atm.getRest()+"元"); 132 break; 133 case 4: 134 System.out.println("输入新的六位数密码:"); 135 String p=in.next(); 136 if(p.length()==6&&whetherNum(p)) 137 atm.setPassword(p); 138 else{ 139 System.out.println("不是六位或者不是数字!"); 140 } 141 break; 142 case 5: 143 System.out.println("当前余额:"+atm.getRest()+"元"); 144 break; 145 default: 146 continue next; 147 } 148 } 149 } 150 else{ 151 System.out.println("密码错误!"); 152 try{ 153 passwordErrorTimes++; 154 if(passwordErrorTimes>3) 155 throw pee; 156 } 157 catch(PasswordErrorException e){ 158 System.out.println(e.getMessage()+"账户暂时冻结!"); 159 return ; 160 } 161 } 162 163 } 164 } 165 //显示菜单方法 166 public static void showFace(){ 167 System.out.println("********************"); 168 System.out.println(" 1.存款:"); 169 System.out.println(" 2.取款:"); 170 System.out.println(" 3.转账汇款:"); 171 System.out.println(" 4.修改密码:"); 172 System.out.println(" 5.查询余额:"); 173 System.out.println(" 6.退卡:"); 174 System.out.println("********************"); 175 System.out.println("请选择:"); 176 } 177 //判断字符串是否为整数(0-999999) 178 public static boolean whetherNum(String s){ 179 boolean flag=true; 180 if(s.length()>=7) 181 return false; 182 char arr[]=s.toCharArray(); 183 for(int i=0;i<s.length();i++){ 184 if(arr[i]<'0'||arr[i]>'9') 185 flag=false; 186 } 187 return flag; 188 } 189 } 190 191 class PersonalAccount{ 192 private String passWord="123456";//密码 193 @SuppressWarnings("unused") 194 private String number;//银行卡号 195 private int money=0; 196 public int getMoney(){return money;}//余额 197 public void setPw(String s){passWord=s;}//设置密码 198 public void addMoney(int x){money+=x;}//加钱 199 public void minusMoney(int x){money-=x;}//减钱 200 public boolean whetherPwTrue(String s){//密码是否正确 201 if(s.equals(passWord)) 202 return true; 203 else return false; 204 } 205 } 206 abstract class PATM{ 207 public abstract boolean withdraw(int x);//取款 208 public abstract void save(int x);//存款 209 public abstract boolean transfer(String s,int x);//转账 210 public abstract boolean ifPass(String s);//判断输入的密码是否正确 211 public abstract int getRest();//查询余额 212 public abstract void setPassword(String s);//设置密码 213 } 214 class ATM extends PATM{ 215 private String numbers[]={"6227000000000000071","6227000000000000072", 216 "6227000000000000073","6227000000000000074"};//数据库中已有的账户卡号 217 private PersonalAccount account=new PersonalAccount(); 218 public boolean withdraw(int x) { 219 if(x>account.getMoney()) 220 return false; 221 else{ 222 account.minusMoney(x); 223 return true; 224 } 225 } 226 public void save(int x) { 227 account.addMoney(x); 228 } 229 public boolean transfer(String s, int x) { 230 //转账 231 //先判断转到账户号是否存在 232 //再判断余额是否足够 233 boolean flag=false; 234 for(int i=0;i<numbers.length;i++) 235 if(s.equals(numbers[i])) flag=true; 236 if(x>account.getMoney()) flag=false; 237 if(x<=account.getMoney()&&flag) account.minusMoney(x);; 238 return flag; 239 } 240 public boolean ifPass(String s) { 241 return account.whetherPwTrue(s); 242 } 243 public int getRest() { 244 return account.getMoney(); 245 } 246 public void setPassword(String s) { 247 account.setPw(s); 248 } 249 } 250 @SuppressWarnings("serial") 251 class NumberErrorException extends Exception{ 252 public NumberErrorException(String msg){ 253 super(msg); 254 } 255 } 256 @SuppressWarnings("serial") 257 class PasswordErrorException extends Exception{ 258 public PasswordErrorException(String msg){ 259 super(msg); 260 } 261 } 262 @SuppressWarnings("serial") 263 class NotHundredTimesException extends Exception{ 264 public NotHundredTimesException(String msg){ 265 super(msg); 266 } 267 }