出现问题:
每次只能保存一位用户信息,后面输入用户信息前面的用户信息会被覆盖
出现原因及解决方法:
因为暂存的temp对象被定义为全局变量,所以每次进去都被刷新为新对象,将其
User temp = new User(); 放在方法内即可,
空指针异常问题:
java.lang.NullPointerException
at java.util.Calendar.setTime(Calendar.java:1770)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:943)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936)
at java.text.DateFormat.format(DateFormat.java:345)
at Project.campusparttimejobversions4.view.JobView.applyJobForYourself(JobView.java:301)
at Project.campusparttimejobversions4.view.JobView.partTimeJobApplication(JobView.java:132)
at Project.campusparttimejobversions4.view.IndexView.softwareMainMenu(IndexView.java:123)
at Project.campusparttimejobversions4.view.IndexView.main(IndexView.java:86)
新加定义语句:
成了但好像没完全成,之前if……else……逻辑结构好像没理清,还有输出错误
明明有内容确未查询到
重新编写了一下申请兼职工作的方法
// 你自己个人申请工作
public void applyJobForYourself(Integer jid, Date workStart) throws IOException, ClassNotFoundException {
// ArrayList<Job> jobinf = IOUtils.myDeserializable(JOBINF); //将数据反序列化出来
ApplyJob aj = new ApplyJob();
ArrayList<ApplyJob> job2 = new ArrayList<ApplyJob>();
for (int i = 0; i < jobinf.size(); i++) {
Job j = jobinf.get(i);
if (j.getJid().equals(jid) && j.getJobDemand() > 0) {
System.out.println("目前这个职位需要" + j.getJobDemand() + "人" + "您可以加入工作!");
j.setJobDemand(j.getJobDemand() - 1);
j.setStatus(1);
workStart = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("申请成功!于 " + df.format(workStart) + " 开始工作。");
System.out.println("请输入uid:");
String uid = TSUtils.inputCheck(6, 6);
//先存入aj中
aj.setJid(jid);
aj.setUid(uid);
aj.setWorkStart(workStart);
aj.setWorkEnd(null);
job2.add(aj); //存ArrayList<ApplyJob> job2 = new ArrayList<ApplyJob>();
IOUtils.Serializable(job2, YOUJOBINF);//序列化
System.out.println("信息录入完成,您已申请成功!");
break;
}
}
}
好消息是正则表达式成功啦,约束工作完成时间只能在工作开始时间之后
坏消息是出现了错误:
ConcurrentModificationException 当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常
重新整理一下代码逻辑和顺序,成啦!
// 结束工作
private void endJob(Integer jid1, Date workStart) throws Exception {
ArrayList<Job> jobinf = IOUtils.myDeserializable(JOBINF);
ArrayList<ApplyJob> jobb = IOUtils.myDeserializable(YOUJOBINF);
ArrayList<User> array = IOUtils.myDeserializable(INF);
UidJid uidJid = new UidJid();
if (jobb.size() > 0) {
for (User users : array) { //外层for循环遍历用户
for (Job jobs : jobinf) { //内层for循环遍历工作
if (jobs == null) {
throw new RuntimeException("工作查询出错,请联系管理员");
}
if (jobs.getJid().equals(jid1)) { //比较jid
System.out.println("请输入您的uid:");
String uid = TSUtils.inputCheck(6, 6);
if (users.getUid().equals(uid)) { //比较uid
ApplyJob app = new ApplyJob();
Date workEnd = null;
for (ApplyJob aj : jobb) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入结束时间(格式‘2022-08-30’):");
String end = TSUtils.inputCheck(10, 10, "^((?:20(?:22)))\\-((?:0?9)|(?:1[0-2]))\\-((?:0?[1-9])|(?:[1-2][0-9])|30|31)$", "您输入的日期错误,请重新输入。");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
workEnd = format.parse(end);
workStart = aj.getWorkStart();
long day = (workEnd.getTime() - workStart.getTime()) / (24 * 60 * 60 * 1000);
Integer days = Math.toIntExact(day); //Math.toIntExact:将long类型的数据改为int类型的数据
System.out.println("工作总耗时为:" + days + "天");
jobs.setStatus(-1);
if (days <= jobs.getJobTime() && jobs.getJobLevel() == 5) {
Double tmp = users.getBalance();
tmp += jobs.getSalary();
System.out.println("按时完成工作,您的信用等级良好,请继续保持," +
"本次工作共获得: " + jobs.getSalary());
} else if (days <= jobs.getJobTime() && jobs.getJobLevel() < 5) {
Double tmp = users.getBalance();
tmp += jobs.getSalary();
System.out.println("按时完成工作,您的信用等级为 " + jobs.getJobLevel() + " 恢复信用等级还需完成"
+ ((5 - jobs.getJobLevel()) * 3 - 1) + "次工作" +
"本次工作共获得: " + jobs.getSalary());
return;
} else if (days > jobs.getJobTime() && jobs.getJobLevel() <= 5) {
jobs.setJobLevel(jobs.getJobLevel() - 1);
Double tmp = users.getBalance();
double salary = jobs.getSalary() - (jobs.getSalary() / jobs.getJobTime() * (days - jobs.getJobTime()));
if (salary <= 0) {
salary = 0;
jobs.setSalary(salary);
tmp += jobs.getSalary();
}
}
System.out.println("逾期完成工作,您的信用等级降为 " + jobs.getJobLevel() + " 恢复信用等级还需完成"
+ ((5 - jobs.getJobLevel()) * 3) + "次工作 " +
"本次工作共获得:" + jobs.getSalary());
if (jobs.getJobLevel() == 0) {
System.out.println("警告!信用等级为零,无法再接取任何兼职委托!");
}
app.setWorkStart(workStart);
app.setWorkEnd(workEnd);
if (jobb == null) {
ArrayList<ApplyJob> arrayListAJ = new ArrayList<>();
arrayListAJ.add(app);
IOUtils.Serializable(arrayListAJ, YOUJOBINF); //序列化
} else {
jobb.add(app); //添加到合集中
IOUtils.Serializable(jobb, YOUJOBINF); //序列化
System.out.println("信息录入完成!");
}
break;
}
} else {
System.out.println("未查询到该工作,输入错误!返回主程序。");
return;
}
}
}
for (Job js : jobinf) {
if (js.getJid().equals(jid1)) {
jobinf.remove(uidJid);
System.out.println("该工作已移除");
} else {
System.out.println("输入错误!返回主界面!");
return;
}
}
}
} else {
System.out.println("文件内容为空,请输入后继续操作");
}
}