注:第五节课程任务为更换IDEA并提交记录博客,这里不再给出。

一,快递管理训练任务

描述

本节任务用于熟悉快递管理业务,完成快递管理控制台项目,具体需求如图:

任务卡_02-面向对象_第6节 异常处理_i++

代码

项目结构如下:

任务卡_02-面向对象_第6节 异常处理_新职课开课吧_02

:

Main

package main;

import bean.Express;
import dao.ExpressDao;
import view.View;

public class Main {
// 初始化视图对象
private static View v = new View(); // 这样可以跨方法使用
// 初始化dao对象
private static ExpressDao dao = new ExpressDao();
// 1,弹出身份选择菜单
public static void main(String[] args) {

m:while (true){
int menu = v.menu();
switch (menu){
case 0:
break m;
case 1:
gClient();
break;
case 2:
uClient();
break;
}
}

}

private static void uClient() {
// 1,获得取件码
int code = v.uMenu();
// 2,根据取件码取出快递
Express e = dao.findByCode(code);
if(e == null){
v.printNull();
}else {
v.success();
v.printExpress(e);
dao.delete(e);
}
}

private static void gClient() {
while (true){
int menu = v.gMenu();
switch (menu){
case 0:
return;
case 1:{
// 1,提示输入快递信息
Express e = v.insert();
// 2,此快递是否已经存储过
Express e2 = dao.findByNumber(e.getNumber());
// 3,存储快递
if(e2 == null){ // 未存储过
dao.add(e);
v.printCode(e);
}else { // 单号重复
v.expressExist();
}
break;
}
case 2: {// 快递修改
// 1,提示输入快递信息
String number = v.findByNumber();
// 2,查找数据
Express e1 = dao.findByNumber(number);
// 3,打印快递信息
if(e1 == null){
v.printNull();
}else {
v.printExpress(e1);
// 4,提示修改
v.update(e1); // 这里已经将快递的信息修改过了
dao.update(e1, e1); // 这里只是为了强调 删除-修改的过程
v.printExpress(e1);
}

break;
}
case 3: {// 删除
// 1,输入快递单号
String number = v.findByNumber();
// 2,查找快递对象
Express e = dao.findByNumber(number);
if(e == null){
v.printNull();
}else {
v.printExpress(e);
int type = v.delete();
if(type == 1){
dao.delete(e);
}else {
v.success();
}
}
break;
}
case 4:{ // 查看所有
Express[][] data = dao.findAll(); // 从dao层获取数据
v.printAll(data); // 在视图层显示
break;
}


}
}

}
}

bean.Express

package bean;

import java.util.Objects;

/**
*
*/
public class Express {
private String number; // 快递单号
private String company; // 公司
private int code; // 取件码

// 构造方法
public Express(String number, String company, int code) {
this.number = number;
this.company = company;
this.code = code;
}

public Express() {
}

// getter/setter

public String getNumber() {
return number;
}

public String getCompany() {
return company;
}

public int getCode() {
return code;
}

public void setNumber(String number) {
this.number = number;
}

public void setCompany(String company) {
this.company = company;
}

public void setCode(int code) {
this.code = code;
}

// 重写toString 方法

@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
'}';
}

// 重写equals方法

/**
* 只要快递单号相同就认为快递相同
* @param o
* @return
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
return Objects.equals(number, express.number);
}

@Override
public int hashCode() {
return Objects.hash(code);
}
}

dao.ExpressDao

package dao;

import bean.Express;

import java.util.Random;

public class ExpressDao {
Express[][] data = new Express[10][]; // 二维数组表示快递柜
{
for(int i = 0; i < 10; i++){
data[i] = new Express[10];
}
}
private Random random = new Random(); // 用于生成随机数
private int size; // 当前存储的快递数目(便于判断是否还有空位 否则在随机生成取件码时可能陷入死循环)

/**
* 用于存储快递
* @param e
* @return
*/
public boolean add(Express e){
if(this.size >= 100){
return false;
}
// 1,随机生成两个0-9的下标
int x = -1, y = -1;
while (true){
x = random.nextInt(10);
y = random.nextInt(10);
if(data[x][y] == null){
// 此位置未被占用
break;
}
}
// 2,判断取件码是否重复(最简单的 一个个对比)
int code = randomCode(); // 获得没有重复的取件码
e.setCode(code);
data[x][y] = e;
return true;

}
private int randomCode(){
while (true) {
int code = random.nextInt(900000) + 100000; // 范围(000000-899999)+1000000
Express e = findByCode(code);
if(e == null) { // 说明取件码未重复
return code;
}
}

}

/**
* 快递员根据快递单号查询
* @param number
* @return
*/
public Express findByNumber(String number){
Express e = new Express();
e.setNumber(number);
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
if(e.equals(data[i][j])) { // 注意e确定不为空 但data[i][j]可能为null
return data[i][j];
}
}
}
return null;
}

/**
* 根据取件码查询快递
* @param code 取件码
* @return 查询到结果 查询失败返回null
*/
public Express findByCode(int code){
for(int i = 0; i < 10; i++){ // 这里确定了规格大小
for(int j = 0; j < 10; j++){
if(data[i][j] != null && data[i][j].getCode() == code){
return data[i][j];
}
}
}
return null;
}

/**
* 多余的操作 为了MVC更圆润
* @param oldExpress
* @param newExpress
*/
public void update(Express oldExpress, Express newExpress){
delete(oldExpress);
add(newExpress);
}
public void delete(Express e){
p:for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
if(e.equals(data[i][j])) { // 注意e确定不为空 但data[i][j]可能为null
data[i][j] = null;
break p;
}
}
}
}
public Express[][] findAll(){
return data;
}
}

view.View

package view;

import bean.Express;

import java.util.Scanner;

/**
* 视图层
* 只负责展示视图 不包含其他任何逻辑
*/
public class View {
public Scanner input = new Scanner(System.in);

/**
* 获得用户的角色选择输入,并进入相应的功能
* @return 返回功能码 1:管理原 2:普通用户 0:退出
*/
public int menu(){
System.out.println("根据提示输入功能序号:");
System.out.println("1,管理员");
System.out.println("2,普通用户");
System.out.println("0,退出");
String s = input.nextLine();
int funcNum = -1;
try{
funcNum = Integer.parseInt(s);
}catch (NumberFormatException e){ // 格式异常 递归继续获取功能码
return menu();
}
if(funcNum < 0 || funcNum > 2){ // 功能码不合法
return menu();
}
return funcNum;
}

/*
-----------------------------------------------------------------
*/

/**
* 获得管理员输入的功能码
* @return 管理员输入的合法功能码 1:录入 2:修改 3:删除 4:查看所有 0:退出
*/
public int gMenu(){
System.out.println("根据提示输入功能序号:");
System.out.println("1,快递录入");
System.out.println("2,快递修改");
System.out.println("3,快递删除");
System.out.println("4,查看所有快递");
System.out.println("0,退出");
String s = input.nextLine();
int funcNum = -1;
try{
funcNum = Integer.parseInt(s);
}catch (NumberFormatException e){ // 格式异常 递归继续获取功能码
return gMenu();
}
if(funcNum < 0 || funcNum > 4){ // 功能码不合法
return gMenu();
}
return funcNum;
}

/**
* 1快递员录入信息
* @return 返回包含了快递单号和快递公司的快递对象
*/
public Express insert(){
System.out.println("请根据提示输入快递信息:");
System.out.print("请输入快递单号:");
String number = input.nextLine();
System.out.print("请输入快递公司:");
String company = input.nextLine();
Express e = new Express();
e.setNumber(number);
e.setCompany(company);
return e;
}

/**
* 2修改快递信息
* @param e
*/
public void update(Express e){
System.out.print("请输入新的快递单号:");
String number = input.nextLine();
System.out.print("请输入新的快递公司");
String company = input.nextLine();
e.setNumber(number);
e.setCompany(company);
}

/**
* 3询问是否删除
* @return 给出快递管理员的选择 1:删除 2:取消
*/
public int delete(){
System.out.println("确认是否删除:");
System.out.println("1,确认删除");
System.out.println("2,取消删除");
System.out.println("0,退出");
String s = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(s);
}catch (NumberFormatException e){
return delete();
}
if(num < 0 || num > 2){
return delete();
}
return num;
}

/**
* 4遍历显示所有快递信息
* @param es
*/
public void printAll(Express[][] es){
int count = 0;
for(int i = 0; i < 10; i++){
for(int j = 0;j < 10; j++){
if(es[i][j] != null) {
count++;
System.out.print("第" + (i + 1) + "排," + (j + 1) + "列, ");
printExpress(es[i][j]);
}
}
}
if(count == 0){
System.out.println("暂无快递信息");
}
}

/**
* 提示用户输入快递单号
* @return
*/
public String findByNumber(){
System.out.println("请根据提示输入快递信息:");
System.out.print("请输入需要操作的快递单号:");
String number = input.nextLine();
return number;
}

/**
* 显示快递信息
* @param e
*/
public void printExpress(Express e){
if(e == null){
System.out.println("快递信息不存在");
return;
}
System.out.println("快递信息如下:");
System.out.println("快递公司:" + e.getCompany() + ",快递单号:" + e.getNumber() + ",取件码:" + e.getCode());
}


/*
-----------------------------------------------------------------
*/

/**
* 获得用户输入的取件码(这里简化,只要取件码相同,就算取件成功)
* @return 用户输入的合法功能码(6位)
*/
public int uMenu(){
System.out.println("根据提示进行取件:");
System.out.print("请输入取件码:");
String s = input.nextLine();
int funcNum = -1;
try{
funcNum = Integer.parseInt(s);
}catch (NumberFormatException e){ // 格式异常 递归继续获取功能码
return uMenu();
}
if(funcNum < 100000 || funcNum > 999999){ // 功能码不合法
System.out.println("输入有误,请重试!");
return uMenu();
}
return funcNum;
}

public void expressExist(){
System.out.println("此快递单号已存在,请勿重复存储");
}
public void printCode(Express e) {
System.out.println("新快递的取件码为:" + e.getCode());
}

public void success(){
System.out.println("操作成功!");
}
public void printNull(){
System.out.println("快递不存在,请检查输入");
}

}