期末了,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();
}
}
}
<person>
<p1>
<id id="001">001id>
<name>张三name>
<password>1234password>
<moneyValue>200moneyValue>
p1>
<p1>
<id id="002">002id>
<name>李四name>
<password>123password>
<moneyValue>600moneyValue>
p1>
<p1>
<id id="003">003id>
<name>王五name>
<password>12345password>
<moneyValue>300moneyValue>
p1>
person>
下面是我的代码结果: