Java基础—简易提款机

  • 2019 年 12 月 17 日
  • 筆記

需求:

简易自动提款机

1.创建用户类User(包含卡号、姓名、密码、余额等属性),用户开卡时录入的姓名和密码(自动分配一个卡号、初始金额设置为0)。

2.使用ArrayList或LinkedList存储全部注册用户

形式如:ArrayList<User> userList = new ArrayList<User>();

3.实现功能

(1)存款

(2)取款(如果余额不足要提示)

(3)查询余额(只能查看当前卡号的余额)

4. 技术要求,使用异常处理用户的错误输入(即程序保护容错功能)。

实例:

1.创建自定义异常:

public class OptionsException extends RuntimeException{    	/**  	 *  	 */  	private static final long serialVersionUID = 6307237273922255816L;    	public OptionsException() {  		super();  		// TODO Auto-generated constructor stub  	}    	public OptionsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {  		super(message, cause, enableSuppression, writableStackTrace);  		// TODO Auto-generated constructor stub  	}    	public OptionsException(String message, Throwable cause) {  		super(message, cause);  		// TODO Auto-generated constructor stub  	}    	public OptionsException(String message) {  		super(message);  		// TODO Auto-generated constructor stub  	}    	public OptionsException(Throwable cause) {  		super(cause);  		// TODO Auto-generated constructor stub  	}      }

2.对用户信息(卡号、姓名、密码、余额、存款金额、取款金额)进行封装,并对部分属性进行异常处理:

public class User {    	private String cardNumber;    	private String userName;    	private int code;    	private int balance = 0;    	private int deposit;	//存款金额    	private int withdrawMoney;	//取款金额    	public String getCardNumber() {  		return cardNumber;  	}    	public void setCardNumber(String cardNumber) {  		this.cardNumber = cardNumber;  	}    	public String getUserName() {  		return userName;  	}    	public void setUserName(String userName) {  		this.userName = userName;  	}    	public int getCode() {  		return code;  	}    	public void setCode(int code) throws OptionsException{    		Integer temp = (Integer) code;    		if(temp.toString().length() == 6){  			this.code = code;  		}else{  			throw new OptionsException("您输入的位数有误!");  		}    	}    	public int getBalance() {  		return balance;  	}    	public void setBalance(int balance) throws OptionsException{    		if(balance >= 0){  			this.balance = balance;  		}else{  			throw new OptionsException("余额不足!");  		}  	}    	public int getDeposit() {  		return deposit;  	}    	public void setDeposit(int deposit) throws OptionsException{    		if(deposit >= 0){  			this.deposit = deposit;  		}else{  			throw new OptionsException("存入金额错误!");  		}  	}    	public int getWithdrawMoney() {  		return withdrawMoney;  	}    	public void setWithdrawMoney(int withdrawMoney) throws OptionsException{  		if(withdrawMoney >= 0){  			if(this.getBalance() - withdrawMoney < 0){  				this.withdrawMoney = withdrawMoney;  			}else{  				throw new OptionsException("余额不足!");  			}  		}else{  			throw new OptionsException("取款金额错误!");  		}  	}  }

3.新建一个类,定义用户可进行的操作方法:

import java.util.ArrayList;  import java.util.Random;  import java.util.Scanner;    public class UserOptions {    	/**定义一个ArrayList来存储注册的银行卡信息*/  	public static ArrayList accounts = new ArrayList();    	Scanner scanner = new Scanner(System.in);    	/**调用User 类访问该类下封装的用户信息*/  	User user = new User();    	//为新用户注册银行卡信息  	public void register() throws Exception {    		System.out.println("请输入您的姓名:");  		user.setUserName(scanner.next());    		String cardNumber = randomCardNumber();  		System.out.println("您的卡号为:" + cardNumber);  		user.setCardNumber(cardNumber);      		//用户输入密码时,可能会出现密码不足或超过6位  		try{    			System.out.println("请设置您的密码(6位数字):");    			int code = scanner.nextInt();    			user.setCode(code);    		}catch(OptionsException o){  			o.printStackTrace();  		}finally{  			System.out.println("您卡内目前余额为:" + user.getBalance());    			accounts.add(user);  		}    	}      	//随机生成卡号  	public String randomCardNumber(){      		StringBuilder str=new StringBuilder();//定义变长字符串  		Random random=new Random();    		/**设立一个flag,  		 * 在随机卡号生成后,用于判断生成的卡号是否已经存在。  		 * 如果该卡号已经存在,则再进行一次该方法重新生成卡号,直到生成的卡号不存在为止  		 * 如果该卡号不存在,则将其返回并赋给register()中的user.setCardNumber();  		 */  		boolean flag = true;    		//随机生成数字,并添加到字符串  		/**因为本人持有的银行卡号为19位,所以设置该卡号为19位*/  		for(int i=0;i<19;i++){  		    str.append(random.nextInt(10));  		}      		String cardNumber = str.toString();  		/**对生成的卡号进行存在判断  		 * 如果该卡号已经存在,则flag的值变为false,并中断循环  		 * 如果循环结束,该卡号仍不存在,则将其返回  		 */  		for(int i = 0 ; i < accounts.size() ; i ++){  			if(cardNumber.equals(accounts.get(i).getCardNumber())){  				flag = false;  				break;  			}  		}    		/**flag的值若为true,则证明生成的卡号不存在,可以返回;  		 * 若为false,则证明生成的卡号已经存在,需要重新生成,直到生成的卡号不存在为止*/  		if(flag){  			return cardNumber;  		}else{  			return randomCardNumber();  		}  	}    	//存款  	public void depositMoney(){    		/**设立一个flag,辅助判断输入的卡号是否存在*/  		boolean flag = false;    		/**设立一个index,当卡号存在时,index 接收此时的索引值,方便存款*/  		int index = 0;    		System.out.println("请输入您的卡号:");  		String cardNumber = scanner.next();    		/**遍历查询accouts 中是否存在用户输入的卡号  		 * 若存在,flag的值变为true,同时结束循环,*/  		for(int i = 0 ; i < accounts.size() ; i ++){  			if(cardNumber.equals(accounts.get(i).getCardNumber())){  				flag = true;  				index = i;  				break;  			}  		}      		/**若卡号存在,则需要用户输入密码,密码正确才可以进行操作*/  		if(flag){  			System.out.println("请输入您的密码:");  			int code = scanner.nextInt();    			if(code == accounts.get(index).getCode()){      				/**判断用户输入的金额是否大于0, 若小于0,则报错,并退出程序。  				 * 若正确,则将金额加到余额中*/  				try{    					System.out.println("请输入您想要存储的金额:");  					accounts.get(index).setDeposit(scanner.nextInt());    					int newBalance = accounts.get(index).getBalance() + accounts.get(index).getDeposit();  					accounts.get(index).setBalance(newBalance);  				}catch(OptionsException o){  					o.printStackTrace();  				}finally{  					System.out.println("您目前的余额为:" + accounts.get(index).getBalance());  				}  			}  		}else{  			System.out.println("您输入的卡号不存在,操作已结束!");  		}  	}        	//取款  	public void withdraMoney(){    		/**设立一个flag,辅助判断输入的卡号是否存在*/  		boolean flag = false;    		/**设立一个index,当卡号存在时,index 接收此时的索引值,方便取款*/  		int index = 0;    		System.out.println("请输入您的卡号:");  		String cardNumber = scanner.next();    		/**遍历查询accouts 中是否存在用户输入的卡号  		 * 若存在,flag的值变为true,同时结束循环,*/  		for(int i = 0 ; i < accounts.size() ; i ++){  			if(cardNumber.equals(accounts.get(i).getCardNumber())){  				flag = true;  				index = i;  				break;  			}  		}      		/**若卡号存在,则需要用户输入密码,密码正确才可以进行操作*/  		if(flag){  			System.out.println("请输入您的密码:");  			int code = scanner.nextInt();    			if(code == accounts.get(index).getCode()){      				//注意如果用户要取出的金额大于其余额,要报错  				/**判断用户输入的金额是否大于0, 若小于0,则报错,并退出程序。  				 * 若正确,则将金额加到余额中*/  				try{  					System.out.println("请输入您想要取出的金额:");  					accounts.get(index).setWithdrawMoney(scanner.nextInt());    					int newBalance = accounts.get(index).getBalance() - accounts.get(index).getWithdrawMoney();  					accounts.get(index).setBalance(newBalance);  				}catch(OptionsException o){  					o.printStackTrace();  				}finally{  					System.out.println("您取出了" +accounts.get(index).getWithdrawMoney());  					System.out.println("取出后的余额为:" + accounts.get(index).getBalance());  				}  			}  		}    		if(!flag)  			System.out.println("该卡号不存在!");  	}      	//按照卡号查询余额  	public void queryBalance(){    		/**设立一个flag,辅助判断输入的卡号是否存在*/  		boolean flag = false;    		/**设立一个index,当卡号存在时,index 接收此时的索引值,方便存款*/  		int index = 0;    		System.out.println("请输入您的卡号:");  		String cardNumber = scanner.next();    		/**遍历查询accouts 中是否存在用户输入的卡号  		 * 若存在,flag的值变为true,同时结束循环,*/  		for(int i = 0 ; i < accounts.size() ; i ++){  			if(cardNumber.equals(accounts.get(i).getCardNumber())){  				flag = true;  				index = i;  				break;  			}  		}    		/**若卡号存在,则需要用户输入密码,密码正确才可以进行操作*/  		if(flag){  			System.out.println("请输入您的密码:");  			int code = scanner.nextInt();    			if(code == accounts.get(index).getCode()){    				System.out.println("您目前的余额为:" + accounts.get(index).getBalance());    			}  		}    		if(!flag)  			System.out.println("该卡号不存在!");  	}    }

4.再新建一个类,在该类中写一个方法由用户选择调用上个步骤中写的各个方法(即设置菜单,进行功能选择):

* 1.开户 * 2.存款 * 3.取款 * 4.查询余额

import java.util.Scanner;    public class UserService {    	UserOptions uo = new UserOptions();  	Scanner scanner = new Scanner(System.in);    	/**设置菜单,进行功能选择:  	 * 1.开户  	 * 2.存款  	 * 3.取款  	 * 4.查询余额*/  	@SuppressWarnings("finally")  	public void menu(){    		bulletin();    		while(true){    			System.out.println("请选择您要使用的功能:");  			int choice = scanner.nextInt();    			switch(choice){  				case 1:  				try {  					uo.register();  				} catch (Exception e) {  					// TODO Auto-generated catch block  					e.printStackTrace();  				}finally{  					break;  				}  				case 2:  					uo.depositMoney();  					break;  				case 3:  					uo.withdraMoney();  					break;  				case 4:  					uo.queryBalance();  					break;  				case -1:  					System.exit(0);  			}    			System.out.println("------------------------------n");  		}  	}    	public void bulletin(){  		System.out.println("欢迎使用"不坑你坑谁"牌自动取款机");  		System.out.println("本机提供以下功能,请自助选择:");  		System.out.println("1.开户");  		System.out.println("2.存款");  		System.out.println("3.取款");  		System.out.println("4.查询余额");  		System.out.println("输入-1结束操作");  		System.out.println("------------------------------n");  	}    }

5.最后再主方法中将上一个类进行实例化并使用:

public class Demo {    	public static void main(String[] args) {  		UserService us = new UserService();    		us.menu();  	}  }