Java模拟网上银行业务

风格不统一 提交于 2019-11-30 11:44:48

期末了,Java老师布置了实验报告,实现一个任务(见下图)
我的天,真的是自己敲代码敲得少,那错误真的是一筐一筐的,深受折磨,OMG
下面,总结以下实现该任务中遇到的一些问题
勉励以下自己
但是真正解决完这些问题之后(谢谢我的考神组长大力支持和同班同学的帮助呀)
那心情真超级超级爽,哈哈哈哈哈
想向全世界炫耀,哈哈哈哈哈,也太爽了
当然,我的方法也不是最简单简洁的,但是对于我这个小白来说,我已经很满足啦
下面,开始我的正文啦

任务需求

模拟网上银行业务
      当用户登录时需判断银行卡号和银行卡密码,当输入的卡号和密码都正确时,登录成功,提示当前登录的账户名,并进入下一步选择操作类型。
      操作类型包括四种(存款:1 取款:2 余额:3 修改个人密码:4 退出:0)
      输入数字1、2时,将进行存取款操作,此时需要输入存取的金额,并进行正确的金额加减计算;
      输入数字3时,显示当前账户的余额;输入数字4时,可修改当前账户的密码;
      输入数字0时将退出整个系统。
      提示:可利用HashMap集合存储模拟的账户信息,其中key值用于存储银行卡号,value值用于存储整个账户对象,再利用文件存储该HashMap对象。

问题1:

用Map集合的时候,覆盖问题,但一个key值又对应了很多属性,可以将多个对应的属性存储到一个对象中

public class Login{
	public static void userLogin(){
		//用Map集合的时候,覆盖问题
		String id="001";
		String name;
		String password;
		int Money;
		Map<String ,String> m=new HashMap<String,String>();
		m.put("001","zhangsan");
		m.put("001","1234");
		//map当key值相同的时候,下边会覆盖上边(可以将第一个或第二个key,value调换顺序就可以了,此处不考虑这样的情况)
		//所以可以将上述属性封装成一个对象,存储到一个类中eg:Person
		//即下面这种情况
		Map<String,Person> m=new HashMap<String,Person>();
	}
}

问题2

前提是我将map集合的这个方法抛弃了,选择了我的爱宠,xml文件来实现

java.lang.ClassCastException的错误问题:
-这个错误是由于我输入的银行卡号不存在xml文件中,虽然我进行了判断,但是他还是会报错

	Scanner sc=new Scanner(System.in);
		//得到银行卡号
		System.out.println("请输入银行卡号:");
		String idsc=sc.nextLine();
		//通过id节点的属性得到id节点
		Node idnod=(Node) d.selectObject ("//id[@id='"+idsc+"']");
//报错了
请输入银行卡号:
1234
Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.dom4j.Node
	at cn.itcast.bank.Demo.userLogin(Demo.java:37)
	at cn.itcast.bank.Demo.main(Demo.java:20)

原因是应为如果用户输入的是空或者说是不存在xml中的值,那么就会导致selectObject返回值不可以由Object类型(不为空,但不可以转换)强转为Node类型,返回不了该id节点,下面在对idnod这个节点进行操作就会报错啦

解决方法:

	//输入银行卡号
	System.out.println("请输入您的银行卡号:");
	String idinput=sc.next();
				
	//得到相对应的数据
	//1、得到id
	//通过id节点的属性得到id节点,并且避免了用户输入错误或输入为空的情况
	List nodes = d.selectNodes ("//id[@id='"+idinput+"']");
	Node idnode=null;
	if (nodes.size()==0) {
		System.out.println("您的账号输入错误");
		continue;//continue跳出这次循环,进行下次循环
	}else {
		idnode=(Node) nodes.get(0);
	}
	//这个时候不管用户输入的对还是不对再对idnode进行操作就可以了	
	//得到idnode后获取该节点的password的值
	String pass=idnode.getParent().element("password").getText();
//这样就真正的解决了报错问题
请输入您的银行卡号:
123
您的账号输入错误
请输入您的银行卡号:
1323
您的账号输入错误
请输入您的银行卡号:

总结

在以后的用户登陆过程中,要解决用户的输入账号有误或为空的问题

问题3

break与return问题

package bank.fair;

import java.util.List;
import java.util.Scanner;

import org.dom4j.Document;
import org.dom4j.Node;

public class Login {
	public static Node userLogin(Document d,Scanner sc) {
		
		while(true) {
			//输入银行卡号
			System.out.println("请输入您的银行卡号:");
			String idinput=sc.next();
				
			//得到相对应的数据
			//1、得到id
			//通过id节点的属性得到id节点,并且避免了用户输入错误或输入为空的情况
			List nodes = d.selectNodes ("//id[@id='"+idinput+"']");
			Node idnode=null;
			if (nodes.size()==0) {
				System.out.println("您的账号输入错误");
				continue;//continue跳出这次循环,进行下次循环
			}else {
				idnode=(Node) nodes.get(0);
			}
		
			//得到idnode后获取该节点的password的值
			String pass=idnode.getParent().element("password").getText();
			//用户输入三次,三次过后,账户冻结
			int count=3;
			while(true){
				//输入银行卡密码
				System.out.println("请输入您的银行卡密码");
				String passwordin=sc.next();
				if(count>1) {
					//判断密码是否正确
					if(passwordin.equals(pass)) {
						//1、得到用户用户名
						String name=idnode.getParent().element("name").getText();
						//提醒用户的用户名
						System.out.println(name+"用户,您好,登陆成功");
						/*
						*不知道return自带break方法
						*(可以在循环里直接加上return可以返回,加break会报错,不加break会一直循环下去)
						*这个错的有点蠢,请原谅
						*/
						return idnode;	//return 自带break操作				
					}
					else {							
						System.out.println("您的密码输入错误");	
						System.out.println("您还有"+(count-1)+"次机会");
						count--;
						continue;						
					}
				}
				else{
					System.out.println("您没有机会了");
					return null;
				}				
			}				
		}
	}
}

问题4

一定一定一定要导包,导对、导全需要的包,说来惭愧,解析xml文件的时候,忘记导入下图的第二个报了,报了一晚上错,急得头快秃了,组长也快崩溃了(世上为何有如此蠢之人),结果是这么一个相当相当愚蠢的问题,emmm,算了,自己蠢,我也不说啥了

在这里插入图片描述

终极版本代码(吼吼),献上我的代码

本来很快写完的代码,纠正报错,debug调试由倒持了好几天,但是,总之结果还是好的,还收获了很多很多,再次感谢容忍这么愚蠢的我的组长,好了,献上我的代码之后就要进行期末复习啦(凉凉的数据结构,计算机组成原理和汇编语言,OMG)

登陆方法的实现

package bank.fair;

import java.util.List;
import java.util.Scanner;

import org.dom4j.Document;
import org.dom4j.Node;

public class Login {
	public static Node userLogin(Document d,Scanner sc) {
		
		while(true) {
			//输入银行卡号
			System.out.println("请输入您的银行卡号:");
			String idinput=sc.next();
				
			//得到相对应的数据
			//1、得到id
			//通过id节点的属性得到id节点,并且避免了用户输入错误或输入为空的情况
			List nodes = d.selectNodes ("//id[@id='"+idinput+"']");
			Node idnode=null;
			if (nodes.size()==0) {
				System.out.println("您的账号输入错误");
				continue;//continue跳出这次循环,进行下次循环
			}else {
				idnode=(Node) nodes.get(0);
			}
		
			//得到idnode后获取该节点的password的值
			String pass=idnode.getParent().element("password").getText();
			//用户输入三次,三次过后,账户冻结
			int count=3;
			while(true){
				//输入银行卡密码
				System.out.println("请输入您的银行卡密码");
				String passwordin=sc.next();
				if(count>1) {
					//判断密码是否正确
					if(passwordin.equals(pass)) {
						//1、得到用户用户名
						String name=idnode.getParent().element("name").getText();
						//提醒用户的用户名
						System.out.println(name+"用户,您好,登陆成功");
						return idnode;	//return 自带break操作				
					}
					else {							
						System.out.println("您的密码输入错误");	
						System.out.println("您还有"+(count-1)+"次机会");
						count--;
						continue;						
					}
				}
				else{
					System.out.println("您没有机会了");
					return null;
				}				
			}				
		}
	}
}

用户操作的实现

package bank.fair;

import java.util.Scanner;

import org.dom4j.Document;
import org.dom4j.Node;

import cn.itcast.utils.Dom4jutils;

public class Operate {
	public static void userOperate(Document d,Scanner sc,Node idnode) throws Exception {
	while(true)	{
		
		System.out.println("请输入您要执行的操作:1、存款 2、取款 "
				+ " 3、余额4、修改个人密码 0、退出");	
		int a=sc.nextInt();
		if(a== 1) {
			putInMoney(idnode,d);
			leftMoney(idnode,d);
			continue;
		}
		if(a==2) {
			OutMoney(idnode,d);
			leftMoney(idnode,d);
			continue;
		}
	    if(a==3) {
			leftMoney(idnode,d);
			continue;
	    }
		if(a==4) {
			changePassword(idnode,d);
			continue;
		}
		if(a==0) {
			System.out.println("退出成功");
			break;
		}
		else {
			System.out.println("请输入正确的指令");
			continue;
		}
	 }	
  }
	//用户操作
	//1、存款// 修改xml文件中的money
	public static void putInMoney(Node idnode,Document d) throws Exception {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入您要存入的金额");
		int add=sc.nextInt();//存入金额
		//得到用户本金
				
		//1、得到id的p1节点的money的节点
		Node moneynod=idnode.getParent().element("moneyValue");
		//2、得到money节点的值
		String moneyadd=moneynod.getText();
		int moneyvalue=Integer.parseInt(moneyadd);
		//3、修改moneyvalue的值		
		Integer moneyv=moneyvalue+add;
		String s=moneyv.toString();
		//4、修改money节点的值
		moneynod.setText(s);
				
		//回写
		Dom4jutils.xmlWriters(d);
	}
	//2、取款// 修改xml文件中的money
	public static void OutMoney(Node idnod,Document d) throws Exception {	
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入您要取出的金额");
		int jian=sc.nextInt();//取出金额
		//得到用户本金
						
		//1、得到id的p1节点的money的节点
		Node moneynod=idnod.getParent().element("moneyValue");
		//2、得到money节点的值
		String moneyadd=moneynod.getText();
		int moneyvalue=Integer.parseInt(moneyadd);
				
		//3、修改moneyvalue的值
		//判断剩余金额是否>取款金额
		if(moneyvalue>jian) {
		     Integer moneyv=moneyvalue-jian;
			String s=moneyv.toString();
			//4、修改money节点的值
			moneynod.setText(s);
		}
		else {
			System.out.println("账户余额不足");
		}
						
		//回写
		Dom4jutils.xmlWriters(d);
	}
	//3、用户余额// 查询xml文件中的maoney
	public static void leftMoney(Node idnod,Document d) throws Exception {
		//得到用户本金
				
		//1、得到id的p1节点的money的节点
		Node moneynod=idnod.getParent().element("moneyValue");
		//2、得到money节点的值
		String moneyadd=moneynod.getText();
		System.out.println("您的账户余额为"+moneyadd);
	}
	//4、修改密码//修改 xml文件的password
	public static void changePassword(Node idnod,Document d) throws Exception {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入您要修改的密码");
		String s=sc.nextLine();
		//得到id的p1节点的password的节点
		Node passwordnod=idnod.getParent().element("password");		
		//4、修改password节点的值
		passwordnod.setText(s);
		System.out.println("恭喜您,密码修改完成!");
				
		//回写
		Dom4jutils.xmlWriters(d);
	}
	//0、退出
			
}

主函数

package bank.fair;

import java.util.Scanner;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;


public class Realize {
	public static void main(String[] args) throws Exception {
		SAXReader sr=new SAXReader();
		Document d=sr.read("src/p.xml");
		Scanner sc=new Scanner(System.in);
	
		Node idnode=Login.userLogin(d,sc);
		if(idnode==null) {
			System.out.println("您的账号被冻结,请24小时后再次登陆");
		}
		else {			
			Operate.userOperate(d,sc,idnode);
		}
	}
}

回写方法我将它封装到了cn.itcast.utils自定义包中

package cn.itcast.utils;

import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jutils {
	public static final String PATH="src/p.xml";
	
	//回写方法
	public static void xmlWriters(Document d) {
		
		try {
			OutputFormat format=OutputFormat.createPrettyPrint();
			XMLWriter xmlwriter = new XMLWriter(new FileOutputStream(PATH), format);
			xmlwriter.write(d);
			xmlwriter.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}				
	}
}

<?xml version="1.0" encoding="UTF-8"?>

<person> 
  <p1> 
    <id id="001">001</id>  
    <name>张三</name>  
    <password>1234</password>  
    <moneyValue>200</moneyValue> 
  </p1>  
  <p1> 
    <id id="002">002</id>  
    <name>李四</name>  
    <password>123</password>  
    <moneyValue>600</moneyValue> 
  </p1>  
  <p1> 
    <id id="003">003</id>  
    <name>王五</name>  
    <password>12345</password>  
    <moneyValue>300</moneyValue> 
  </p1> 
</person>

下面是我的代码结果:

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!