01 Java基础语法—第 6 节 综合案例——快递E栈

本文通过一个快递E栈的综合案例,讲解Java基础语法中的问题和解题思路。在实现存取快递功能时,遇到因static关键字使用不当导致的错误,错误源于静态变量index的值在不同方法间未正确处理。文章补充了static关键字的知识点,强调其在类加载时的初始化特性,并提供了修正后的正确代码,实现了功能的正常运行。
摘要由CSDN通过智能技术生成

一、快递 E 栈

问题描述

功能介绍:

  1. 角色切换(快递员和普通用户)
    在这里插入图片描述
    快递员功能:存快递,删除快递,修改快递,查看所有快递
    普通用户功能:取快递
  2. 存快递
    在这里插入图片描述
  3. 删除快递
    在这里插入图片描述
  4. 修改快递
    在这里插入图片描述
  5. 查看所有快递
    在这里插入图片描述
  6. 取快递
    在这里插入图片描述

解题思路

在这里插入图片描述

代码

错误代码

import java.util.Scanner;

public class Test11 {

	static Scanner input = new Scanner(System.in);
	static int length = 100;
	static String[] numbers = new String[length];
	static String[] companies = new String[length];
	static int[] codes = new int [length];
	static int index = -1;///查找空位置,进行添加
	
	public static void main(String[] args) {
		while(true) {
			System.out.println("=====欢迎使用新职课快递柜=====");
			System.out.println("请输入您的身份:1-快递员,2-用户");
			int n = input.nextInt();
			switch(n) {
			case 1:
				deliverChoose();
				break;
			case 2:
				userChoose();
				break;
				default:System.out.println("输入错误,请重新正确输入您的身份。");
			}
		}
	}
	
	private static void deliverChoose() {
		System.out.println("请选择操作:1-存快递 2-删除快递 3-修改快递信息 4-查看所有快递");
		int n = input.nextInt();
		switch(n) {
		case 1:
			saveDelivery();
			break;
		case 2:
			deleteDelivery();
			break;
		case 3:
			modifyDelivery();
			break;
		case 4:
			checkDelivery();
			break;
			default:System.out.println("输入有误,请重新开始");
		}
	}
	
	private static void userChoose() {
		System.out.println("请输入取件码:");
		int code = input.nextInt();
		for(int i = 0; i < codes.length; i ++) {
			if(codes[i] != 0 && codes[i] == code) {
				index = i;
				break;
			}
		}
		if(index == -1) {
			System.out.println("未找到该快递");
		}else {
			//取快递
			numbers[index] = null;
			companies[index] = null;
			codes[index] = 0;
			System.out.println("取件成功");
		}
	}
	
	private static void saveDelivery() {
		System.out.println("请输入快递单号");
		String num = input.next();
		System.out.println("请输入快递公司");
		String company = input.next();
		int code =(int)(Math.random()*1000)+1;//生成随机数
		for(int i = 0; i < numbers.length; i ++) {
			if(numbers[i] == null) {
				index = i;
				break;
			}
		}
		if(index == -1) {
			System.out.println("快递柜已满,无法存入");
		}else {
			numbers[index] = num;
			companies[index] = company;
			codes[index] = code;
			System.out.println("快递已存入,取件码是:" + code);
		}
	}
	
	private static void deleteDelivery() {
		System.out.println("请输入要删除的快递单号:");
		String num = input.next();
		//判断是否有该快递单号
		for(int i = 0; i < numbers.length; i ++) {
			if(numbers[i] != null && numbers[i].equals(num)) {
				index = i;
				//break;
			}
		}
		if(index == -1) {
			System.out.println("未查到快递。");
		}else {
			numbers[index] = null;
			companies[index] = null;
			codes[index] = 0;
			System.out.println("删除成功。");
		}
	}
	
	private static void modifyDelivery() {
		 System.out.println("请输入要修改的快递单号:");
		 String num = input.next();
		//查找快递号是否存在
		 for(int i = 0; i < numbers.length; i ++) {
				if(numbers[i] != null && numbers[i].equals(num)) {
					index = i;
					break;
				}
		}
		 if(index == -1) {
			 System.out.println("未找到快递。");
		 }else {
			 //判断新的号码是否跟以前已有的相同
			 for(int i = 0; i < numbers.length; i ++) {
				 System.out.println("请输入新的快递单号:");
				 String newNum = input.next();
				 if(numbers[i].equals(newNum)) {
					 break;
				 }else {
					 System.out.println("请输入新的公司名称");
                     String company1 = input.next();
                     //取件码不修改
                     numbers[index] = newNum;
                     companies[index] = company1;
                     System.out.println("修改成功");
                     break;
				 }
			 }
		 }
	}
	
	private static void checkDelivery() {
		if(numbers[0] == null) {
			System.out.println("快递柜为空,暂无数据");
		}else {
			 System.out.println("所有快递信息如下:");
             System.out.println("快递单号\t公司名称\t取件码");
             for(int i = 0; i < numbers.length; i ++) {
            	 if(numbers[i] != null) {
            		 System.out.println(numbers[i] + "\t" + companies[i] + "\t" + codes[i]); 
            	 }
             }
		}
	}
}

运行结果(错误):

输入多次相同的取件码,显示还是取件成功!?
在这里插入图片描述

错误源

主要是static关键字未能很好运用,代码中用index查找空位置且被static修饰,此时index一开始就被赋值-1,然后在代码中其他方法执行时,会改变其值,但是这个值是被改变之后的值,而不是-1了,接下来如果运用到index则会使用改变后的值。故出现上面的错误。

知识补充

涉及到static关键字,这个关键字是在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。

想了解更更多关于static关键字,那就可以阅读这篇博客Java 关键字static 还搞不懂?看这一篇文章就足够了!详细解释!

正确代码

import java.util.Random;
import java.util.Scanner;

/**
 * @Author: 爱摸鱼的TT~
 * @Description: 快递E栈
 * 运用 变量,流程控制,数组 三部分知识
 * @Date Created in 2021-03-25 19:29
 * @Modified By:
 */
public class Demo {
    static Scanner input = new Scanner(System.in);
    static String[] number = new String[100];// 快递单号
    static String[] company = new String[100];// 快递公司
    static int[] code = new int[100];// 快递取件码

    public static void main(String[] args) {
        f:while (true) {
            System.out.println("-------- 欢迎使用爱摸鱼的TT~快递柜--------");
            System.out.println("请输入您的身份:1-快递员,2-用户, 0-退出系统");
            int num = input.nextInt();
            switch(num){
                case 1: // 快递员
                    deliverChoose();
                    break;
                case 2: // 用户
                    userChoose();
                    break;
                case 0:// 退出系统
                    exit();
                    break f;
                default:
                    System.out.println("您输入有误,请重新输入");
            }
        }
    }

    private static void exit() {
        System.out.println("欢迎您下次使用爱摸鱼的TT~快递系统");
    }

    private static void deliverChoose() {
        System.out.println("请选择操作:1-存快递,2-删快递,3-修改快递,4-查看所有快递");
        int num = input.nextInt();
        switch (num) {
            case 1://存快递
                saveDelivery();
                break;
                case 2://删快递
                    deleteDelivery();
                    break;
                case 3:// 改快递
                    modifyDelivery();
                    break;
                case 4: // 查找快递
                    checkDelivery();
                    break;
                default:
                    System.out.println("输入有误,请重新输入!");
            }
    }

    private static void checkDelivery() {
        boolean flag = false;
        for (int i = 0; i < number.length; i ++){
            if(number[i] != null){
                flag = true;
            }
        }
        if(flag == false){
            System.out.println("快递柜为空,暂无数据");
        }else{
            System.out.println("所有快递信息如下:");
            System.out.println("快递单号\t公司名称\t取件码");
            for(int i = 0 ; i <number.length; i ++){
                if(number[i] != null){
                    System.out.println(number[i] + "\t" + company[i] + "\t" + code[i]);
                }
            }
        }
    }

    private static void modifyDelivery() {
        int index = -1;
        System.out.println("请输入要修改的快递单号:");
        String num= input.next();
        //查询是否存在该快递单号
        for(int i = 0; i < number.length; i ++){
            if(number[i] != null && number[i].equals(num)){
                index = i;
                break;
            }
        }
        if(index == -1){
            System.out.println("未找到该快递!");
        }else{
            System.out.println("请输入新的快递单号:");
            String num_1 = input.next();
            // 判断新的快递单号是否存在相同的
            for(int i = 0; i <number.length; i ++) {
                if (number[i] != null && number[i].equals(num_1)) {
                    System.out.println("该快递单号与已有的重复,请重新输入!");
                    System.out.println("请再次输入新的快递单号:");
                    num_1 = input.next();
                }
            }
            System.out.println("请输入新的快递公司:");
            String company_1 = input.next();
            // 取件码不变
            number[index] = num_1;
            company[index] = company_1;
            System.out.println("修改成功!");
        }
    }

    private static void deleteDelivery() {
        int index = -1; // 标记
        System.out.println("请输入您要删除的快递单号:");
        String num = input.next();
        // 判断是否存在该快递单号
        for(int i = 0; i < number.length; i ++){
            if(number[i] != null && number[i].equals(num)){
                index = i;
                break;
            }
        }
        // 判断该快递单号的快递是否找到
        if(index == -1){
            System.out.println("未找到该快递");
        }else{
            number[index] = null;
            company[index] = null;
            code[index] = 0;
            System.out.println("删除成功!");
        }
    }

    private static void saveDelivery() {
        int index = -1; // 标记
        System.out.println("请输入快递单号:");
        String num_1 = input.next();
        System.out.println("请输入快递公司:");
        String company_1 = input.next();
        // 生成随机数
        Random random = new Random();
        int codes = random.nextInt(999999);
        f:for(int i = 0; i < number.length; i ++){
            if(number[i] == null){
                index = i;
                break;
            }
        }
        // 判断快递柜是否存满
        // 若可以存储,还要比较新的快递单号是否与以往相同
        // 若不相同,则把相应信息存储在内
        if(index == -1){
            System.out.println("快递柜已存满,无法存入了!");
        }else{
            // 判断快递单号是否已存在(*)
            for(int i = 0; i < number.length; i++){
                if(number[i] != null && number[i].equals(num_1)){
                    System.out.println("该快递单号已存在,请重新输入新的快递单号!");
                    num_1 = input.next();
                }else{
                    number[index] = num_1;
                    company[index] = company_1;
                    code[index] = codes;
                    System.out.println("快递已存入,取件码是:" + codes);
                    break;
                }
            }

        }
    }

    private static void userChoose() {
        int index = -1; // 标记
        System.out.println("请输入取件码:");
        int num = input.nextInt();
        for(int i = 0; i < code.length; i++){
            if(code[i] != 0 && code[i] == num){
                index = i;
                break;
            }
        }
        if(index == -1){
            System.out.println("未找到相应的快递!");
        }else{ // 取件成功
            // 将相对应的快递单号、公司、取件码都删除。
            number[index] = null;
            company[index] = null;
            code[index] = 0;
            System.out.println("取件成功,欢迎下次使用!");
        }
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛涛同学debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值