java尚硅谷项目二


package client_management_system;

import tool.CMUtility;

public class CustpmerView {//视图层
    private CustpmerList List = new CustpmerList(10);
    
    
    public CustpmerView() {
        customer cust = new customer("??", '男', 19, "15892665907", "2080669931@qq.com");
        List.addCustomer(cust);
    }
    /**
     * 'enter'软件主页面
     */
    public void enter() {
        
        boolean isFlag = true;
        while(isFlag) {
            
            System.out.println("----------欢迎进入客户信息管理软件-----\n");
            System.out.println("\t\t1  添加客户信息");
            System.out.println("\t\t2  修改客户数据");
            System.out.println("\t\t3  删除客户数据");
            System.out.println("\t\t4  显示客户列表");
            System.out.println("\t\t5  退      出\n");
            
             char readM = CMUtility.readMenuSelection();
             switch(readM) {
             case '1':
                 addNew();
                 break;
             case '2':
                 modify();
                 break;
             case '3':
                 delete();
                 break;
             case '4':
                 llstAll();
                 break;
             case '5':
                 System.out.println("请确认是否退出(Y/N):");
//                 break;
                 char readC = CMUtility.readConfirmSelection();
                 if(readC == 'Y') {
                     
                         isFlag = false;
                 }
             }
            
        } 
        //while (isFlag);
        
        
    }
    /**
     * 'addNew'添加客户操作
     */
    private void addNew() {
        System.out.println("------添加客户------\n");
        System.out.print("姓名:");
        String name = CMUtility.readString(4);
        
        System.out.print("性别:");
        char gender = CMUtility.readChar();
        
        
        System.out.print("年龄:");
        int age = CMUtility.readInt();
        
        System.out.print("电话号码:");
        String phone = CMUtility.readString(11);
        
        System.out.print("邮箱:");
        String email = CMUtility.readString(20);
        
        
        //将上述数据封装
        customer cust = new customer(name, gender, age, phone,email);
        boolean isS = List.addCustomer(cust);
        if(isS) {
            System.out.println("------添加成功!------");
        }else {
            System.out.println("------客户数据已满,添加失败!------");
        }
        
        
        
        System.out.println("------(已自动返回主界面)------\n");
    }
    /**
     * 'modify'修改客户操作
     */
    private void modify() {
        System.out.println("------修改客户------\n");
        customer cust;
        int number;
        for(;;) {
            
            System.out.print("请选择要修改的客户编码(-1退出:)");
            
            number = CMUtility.readInt();
            if(number == -1) {
                System.out.println("程序已退出(以自动返回主界面)");
                return;
            }
                cust = List.getcustomer(number - 1);//当使用者输入1时这里索引需要减一
                if(cust == null) {
                    
                    System.out.println("无法找到指引客户!(请联系管理员,以自动返回主界面!)");
                    //break;
                    
                }else {//找到指定客户开始下一步进行
                    break;//结束循环
                    
                }
            }
            //跳出循环:
            System.out.print("姓名("+cust.getName()+"):");
            String name = CMUtility.readString(5, cust.getName());
            
            
            System.out.println("性别("+cust.getGender()+"):");
            char gender = CMUtility.readChar(cust.getGender());
            
            System.out.println("年龄("+cust.getAge()+"):");
            int age = CMUtility.readInt(cust.getAge());
            
            
            System.out.println("电话("+cust.getPhone()+"):");
            String phone = CMUtility.readString(13,cust.getPhone());
            
            System.out.println("邮箱("+cust.getEmail()+")");
            String email = CMUtility.readString(30, cust.getEmail());
            
            customer newCust = new customer(name, gender, age, phone, email);
            
            boolean  isTrue = List.replaceCustoomer(number-1, newCust);
            if(isTrue) {
                System.out.println("-----修改完成------");
            }else {
                System.out.println("-----修改失败()------");
            }
            
        }
        
        
        
        
        
    
    /**
     * 'delete'删除客户操作
     */
    private void delete() {
        System.out.println("----删除客户-----");
        customer cust;
        int number;
        for(;;) {
        System.out.println("选择待删除客户的编号(-1):");
        number = CMUtility.readInt();
        if(number == -1) {
            System.out.println("已取消选择返回主页面!");
            return ;
        }
            cust = List.getcustomer(number - 1);
            if(cust == null) {
                
                System.out.println("无法找到指定客户!");
                
                
            }else {
                break;
            }
        }
        //找到了指定客户
        System.out.println("是否确认删除(Y/N):");
        char read = CMUtility.readConfirmSelection();
        if(read == 'Y') {
            boolean delete = List.deleteCustomer(number - 1);
            if(delete) {
                System.out.println("删除成功!(已自动返回主页面)");
            }else {
                System.out.println("取消删除!(已自动返回主页面)");
            }
        }else {
            return;
        }
    }
    
    /**
     * 'llstAll'查看(显示)客户操作
     */
    private void llstAll() {
        System.out.println("--------客户列表--------\n");
        
        int total = List.getTotal();
        if(total == 0) {
            System.out.println("系统中暂无任何客户记录!");
        }else {
            System.out.println("编号:\t姓名:\t性别:\t年龄:\t电话:\t\t邮箱:\t");
            customer[] allc = List.getAllcustomers();
            for(int i = 0 ;i<total;i++) {
                customer cust = allc[i];
                System.out.println(i+1+"       "+allc[i].getName()+"     "+allc[i].getGender()+"       "+allc[i]
                        .getAge()+"      "+allc[i].getPhone()+"     "+allc[i].getEmail()+"  ");
                
            }
        }
        
        
        System.out.println("\n--------数据陈列完毕-----\n(已自动返回主页面)");
    }
    public static void main(String[] args) {
        CustpmerView view = new CustpmerView();
        view.enter();
        
    }
}



一直学到最后他这个每次删除后出现的列表的呈现错误

img

所有的代码如下:

package client_management_system;

import java.util.Objects;

public class customer {//对象信息类
    private String name;
    private char gender;//性别
    private int age;
    private String phone;//电话号码
    private String email;//电子邮箱
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public char getGender() {
        return gender;
    }
    public void setGender(char gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    
    public customer(String name, char gender, int age, String phone, String email) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.phone = phone;
        this.email = email;
    }
    
    
}



package client_management_system;

public class CustpmerList {//逻辑模块
    private customer[] customers;//用来保存客户数据,数组
    private int total = 0;//'total'(总的),记录已保存客户的数量
    
    
    /**
     * 用来初始化customer数组的构造器
     * @param totalcustomer:用来指定数组的长度
     * 
     */
    public CustpmerList(int totalcustomer) {
        customers = new customer[totalcustomer];//动态初始化
    }
    /**
     * 'addCustomer'添加指定的客户到数组(customer1)中
     * @param customer1
     * @return true:添加成功;false:添加失败
     */
    public boolean addCustomer(customer customer1) {
        //return false;
        if(total >= customers.length) {
            return false;
        }else {
            customers[total] = customer1;
            total++;
            return true;
        }
    }
    /**
     * 'replaceCustoomer'修改指定索引位置上的客户信息
     * @param index:索引位置
     * @param cust:要修改的数据
     * @return true:成功;false:失败;
     */
    public boolean replaceCustoomer(int index,customer cust) {
        //return false;
        
        if(index < 0 || index >= total) {
            return false;
        }else {
            customers[index] = cust;
            return true;
        }
    }
    /**
     * 'deleteCustomer'删除指定位置上的客户
     * @param index
     * @return
     */
    public boolean deleteCustomer(int index) {
        //return false;
        if(index < 0 || index >= total) {
            return false;
        }else {
                for(int i = index;i < total-1;i++) {//后一个替换前一个
                    customers[i] = customers[i + 1];
            }
            customers[total-1]=null;
            return true;
        }
    }
    /**
     * 'getAllcustomers'获取所有的客户信息 
     * @return
     */
    public customer[] getAllcustomers() {
        //return customers;
        customer[] custs = new customer[total];
        for(int i = 0; i < total;i++) {
            custs[i] = customers[i];
            
        }
        return custs;
    }
    
    /**
     * 'getcustomer'获取指定位置上的客户
     * @param index
     * @return
     */
    public customer getcustomer(int index) {
        //return null;
        if(index < 0 || index >= total) {
            return null;
        }
        return customers[index];
    }
    /**
     * 'getTotal'获取储存的客户的数量
     * @return
     */
    public int getTotal() {
        return total;
        
    }
}



package tool;

import java.util.*;

public class CMUtility {//工具类
    public static void main(String[] args) {
        //System.out.println(readMenuSelection());
    }
    private static Scanner scanner = new Scanner(System.in);
    /**
     * 用于界面菜单的选择。该方法读取键盘用户键入的‘1’-‘5’的任意字符,方法返回。
     * 
     */
    public static char readMenuSelection() {
        // 获取功能选择
        char c;
        for (;;) {
            String str = readKeyBoard(1, false);
            c = str.charAt(0);
            if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5') {
                System.out.println("选择错误,请重新输入(1-5):");
            } else break;
        }
        return c;
    }
    
    /**
     * 从键盘读取一个字符,并将其作为方法的返回值。
     * 获取性别
     */
    public static char readChar(){
        String str = readKeyBoard(1,false);
        return str.charAt(0);
    }
    /**
     *从键盘读取一个字符,并将其作为方法的返回值。
     *如果用户不输入字符而回车,方法将以defaultValue 作为返回值。 
     *
     */
    public static char readChar(char defaultValue){
        String str = readKeyBoard(1,true);
        return (str.length()==0)? defaultValue : str.charAt(0);
    }
    /**
     * 从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。
     * 获取年龄
     */
    public static int readInt(){
        int n;
        for(;;){
            String str = readKeyBoard(2,false);
            try{
                n = Integer.parseInt(str);
                break;
            }catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    /**
     * '修改客户数据'
     *从键盘读取一个字符,并将其作为方法的返回值。
     *如果用户不输入字符而回车,方法将以defaultValue 作为返回值。
     */
    public static int readInt(int defaultValue){
        //修改年龄信息时,不输入信息直接回车
        int n;
        for (; ; ) {
            String str = readKeyBoard(2,true);
            if (str.equals("")) {
                return defaultValue;
            }
            try{
                n = Integer.parseInt(str);
                break;
            }catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    /**
     * 从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。
     */
    public static String readString(int limit){
        return readKeyBoard(limit,false);
    }
    /**
     * 从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。
     * 如果用户不输入字符而直接回车,方法将以defaultVaue作为返回值。
     */
    public static String readString(int limit,String defaultValue){
        //修改姓名、电话、邮箱时,不输入信息直接回车
        String str = readKeyBoard(limit,true);
        return str.equals("") ? defaultValue : str;
    }
    /**
     * 用于确认选择的输入。该方法从键盘读取‘Y’或‘N’,并将其作为方法的返回值。
     */
    public static char readConfirmSelection(){
        //获取确认的输入
        char c;
        for( ; ; ){
            String str = readKeyBoard(1,false).toUpperCase();
            c = str.charAt(0);
            if (c=='Y' || c=='N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入: ");
            }
        }
        return c;
    }
    
    private static String readKeyBoard(int limit,boolean blankReturn){
        String line = "";
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();
            if (line.length() == 0) {
                if (blankReturn) return line;
                else continue;
            }
            
            if (line.length() < 1 || line.length() > limit){
                System.out.println("输入长度(不大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }
        return line;
        
    }

}



因为你在删除用户的时候,CustpmerList的总数total没有减1,就导致你的customer[] customers是空的,但是total还是1,查看顾客列表的时候,total显示还有一个用户,但是customers里面是空的,就会报空指针了,
你在你的CustpmerList类里面的deleteCustomer方法里面, return true;前面加上一行total = total-1;也就是删除成功的话,把total减1,就不会报错了
如果有用,请给个采纳,谢谢

img


看报错 断点调试一下 一步一步走看看