第一阶段模块四作业第一题

该博客介绍了一个学生信息管理系统的设计与实现,包括自定义异常类(学号异常和年龄异常)、学生类的序列化以及系统启动和退出时的数据持久化操作。通过视频链接展示了如何使用学生管理系统进行增删改查等操作,并提供了完整的代码实现。
摘要由CSDN通过智能技术生成

题目:
基于学生信息管理系统增加以下两个功能:
a.自定义学号异常类和年龄异常类,并在该成员变量不合理时产生异常对象并抛出。
b.当系统退出时将 List 集合中所有学生信息写入到文件中,当系统启动时读取文件中所 有学生信息到 List 集合中。

思路:
异常类直接按照异常类模板写即可;因为学生类是对象,所以在写入文件前需要先继承序列化接口才行。具体代码如下。

视频:https://www.bilibili.com/video/BV17V411Y7PL

自定义年龄异常类:

package step1_task4_homework.student;

public class AgeException extends Exception {
    private static final long serialVersionUID = -3845167507583617419L;

    public AgeException() {
    }

    public AgeException(String message) {
        super(message);
    }
}

自定义学号异常类:

package step1_task4_homework.student;

public class NumException extends Exception {

        private static final long serialVersionUID = 7730447577146067186L;

        public NumException() {
        }

        public NumException(String message) {
            super(message);
        }
}

Student包装类:

package step1_task4_homework.student;

import java.io.Serializable;

/**
 * student类
 */
public class Student implements Serializable {
    private static final long serialVersionUID = -1456560029227340540L;
    private int number;
    private String name;
    private int age;

    public Student() {
    }

    public Student(int number, String name, int age) throws NumException, AgeException {
            setNumber(number);
            setName(name);
            setAge(age);
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) throws NumException {
        if (number >= 1000){
            this.number = number;
        }else {
            throw new NumException("请输入正确的学号!");
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws AgeException {
        if (age>0 && age<150){
            this.age = age;
        }else {
            throw new AgeException("请输入正确的年龄!");
        }
    }

    @Override
    public String toString() {
        return "Student{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Student功能实现类:

package step1_task4_homework.student;

import java.io.*;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

/**
 * student功能实现类
 */
public class StudentImpl {
//    初始化界面
    public static int show(){
        System.out.println("简易学生信息管理系统");
        System.out.println("--------------------------------------------");
        System.out.println("1.新增学生  2.删除学生  3.修改学生信息");
        System.out.println("4.查找学生信息  5.查看所有学生信息  6.退出系统");
        System.out.println("--------------------------------------------");
        System.out.println("请选择相应功能:");
        Scanner sc = new Scanner(System.in);
        int choose = sc.nextInt();
        return choose;
    }

    /**
     * 简易新增学生功能,目前不对是否有重复学号做验证
     * @param lt 保存学生信息的list
     */
    public static void add(List<Student> lt) throws NumException, AgeException {
        Scanner sc =  new Scanner(System.in);
        System.out.println("新增学生界面");
        int number;
        String name;
        int age;
//        用来控制是否继续新增学生
        String isContinue = "Y";
        while ("Y".equals(isContinue)  || "y".equals(isContinue) ){
            System.out.println("请输入新增学生的学号:");
            number = sc.nextInt();
            System.out.println("请输入新增学生的姓名:");
            name = sc.next();
            System.out.println("请输入新增学生的年龄:");
            age = sc.nextInt();
            lt.add(new Student(number, name, age));
            System.out.println("是否继续新增?Y/N");
            isContinue = sc.next();
            System.out.println("是否继续" + isContinue);
        }
        System.out.println("退出新增学生界面。。。");

    }

    /**
     * 按学号删除学生信息,如果学号有重复,则只删除找到的第一个符合学号的学生
     * @param lt 保存学生信息的list
     */
    public static void delStu(List<Student> lt){
        Scanner sc =  new Scanner(System.in);
        System.out.println("删除学生界面");
//        学生学号
        int number ;
//        用来识别是否已经删除了学生
        int isDel = 0;
//        用来控制是否继续删除学生
        String isContinue = "Y";
        List<Student> needDelStudent = new ArrayList<>();
        while ("Y".equals(isContinue)  || "y".equals(isContinue) ){
            isDel = 0;
            System.out.println("请输入待删除学生的学号:");
            number = sc.nextInt();
//            循环获取list里所有学生信息
            for (Student s:lt){
//                如果找到该学生学号,则删除该学生
                if (number == s.getNumber()){
                    needDelStudent.add(s);
//                    lt.remove(listIndex);
                    System.out.println("学号为" + number +"的学生已删除。。。");
                    isDel++;
                }
            }
//            从列表里删除学生
            lt.removeAll(needDelStudent);
//            说明输入的学号没有在list里找到
            if (0 == isDel){
                System.out.println("未找到该学号的学生,请重新输入!");
            }
            System.out.println("是否继续删除?Y/N");
            isContinue = sc.next();
        }
        System.out.println("退出删除学生界面。。。");
    }



    /**
     * 按学号修改学生信息,默认学号不能被修改,如果学号有重复则只会修改查找到的第一个学号
     * 目前一次只能修改学生的一个信息,如果需要修改多个信息,需重新输入该学生学号
     * @param lt 保存学生信息的list
     */
    public static void modifyStu(List<Student> lt) throws AgeException {
        Scanner sc =  new Scanner(System.in);
        System.out.println("修改学生界面");
        int number;
        String name;
        int age;
//        用来控制是否找修改了学生
        int isModify = 0;
//        用来控制是否继续修改学生
        String isContinue = "Y";
        while ("Y".equals(isContinue)  || "y".equals(isContinue) ){
            isModify = 0;
            System.out.println("请输入待修改学生的学号:");
            number = sc.nextInt();
//      查找该学生信息
            for (Student s:lt){
//                如果找到该学生学号,则先显示
                if (number == s.getNumber()){
                    System.out.println("学号为" + number +"的学生信息为" );
                    System.out.println("学号:" +number + " 姓名:" + s.getName() + " 年龄:" + s.getAge());
                    System.out.println("请输入待修改的信息");
                    System.out.println("-----------------------------------");
                    System.out.println("1.姓名  2.年龄");
                    System.out.println("-----------------------------------");
//                   用来接收输入信息
                    number = sc.nextInt();
//                    判断是需要修改姓名还是要修改年龄
                    if (1 == number){
                        System.out.println("请输入学生新的姓名");
                        name = sc.next();
                        s.setName(name);
                    }else if(2 == number){
                        System.out.println("请输入学生新的年龄");
                        age = sc.nextInt();
                        s.setAge(age);
                    }else{
                        System.out.println("输入错误,请重新输出!");
                    }
//                    说明有学生信息被修改了
                    isModify++;
                }
            }
//            说明学生没有被修改过
            if (0 == isModify){
                System.out.println("未找到该学号的学生,请重新输入!");
            }
            System.out.println("是否继续修改?Y/N");
            isContinue = sc.next();
            System.out.println("是否继续" + isContinue);
        }
        System.out.println("退出修改学生界面。。。");

    }

    /**
     * 查找学生功能
     * @param lt 保存学生信息的list
     */
    public static void findStu(List<Student> lt){
        Scanner sc =  new Scanner(System.in);
        System.out.println("查找学生界面");
        int number;
        String name;
        int age;
//        用来控制是否找找到了学生
        int isFind = 0;
//        用来控制是否继续查找学生
        String isContinue = "Y";
        while ("Y".equals(isContinue)  || "y".equals(isContinue) ){
            isFind = 0;
            System.out.println("请输入按哪种条件查找学生:");
            System.out.println("---------------------------");
            System.out.println("1.学号  2.姓名  3.年龄");
            System.out.println("---------------------------");
            number = sc.nextInt();
//      查找该学生信息
            switch (number){
                case 1:
                    System.out.println("请输入待查找学生的学号");
                    number = sc.nextInt();
//                    循环从list里取出学生信息去做对比
                    for (Student s:lt){
                        if (number == s.getNumber()){
                            System.out.println("学号为" + number + "的学生姓名为:" +
                                    s.getName() + "年龄为:" + s.getAge());
                            isFind++;
                        }
                    }
                    break;
                case 2:
                    System.out.println("请输入待查找学生的姓名");
                    name = sc.next();
                    for (Student s:lt){
                        if (name.equals(s.getName()) ){
                            System.out.println("姓名为" + name + "的学生学号为:" +
                                    s.getNumber() + "年龄为:" + s.getAge());
                            isFind++;
                        }
                    }
                    break;
                case 3:
                    System.out.println("请输入待查找学生的年龄");
                    age = sc.nextInt();
                    for (Student s:lt){
                        if (age == s.getAge()){
                            System.out.println("年龄为" + age + "的学生学号为:" +
                                    s.getNumber() + "姓名为:" + s.getName());
                            isFind++;
                        }
                    }
                    break;
                default:
                    System.out.println("请输入正确序号!");
            }

//            没有找到学生信息
            if (0 == isFind){
                System.out.println("未找到学生信息,请重新输入!");
            }
            System.out.println("是否继续查找?Y/N");
            isContinue = sc.next();
            System.out.println("是否继续" + isContinue);
        }
        System.out.println("查找学生界面。。。");

    }

    /**
     * 遍历所有学生信息
     * @param lt 保存学生信息的list
     */
    public static void findAllStu(List<Student> lt){
        Scanner sc =  new Scanner(System.in);
        System.out.println("所有学生信息界面");
        int number;
        String name;
        int age;
        for (Student s:lt){
            System.out.println(s.getNumber() + "学生姓名为:" + s.getName()
            + "学生年龄为:" + s.getAge());
        }
        System.out.println("退出所有学生信息界面。。。");

    }

    /**
     * 将学生信息写入到文件中
     * @param lt 保存学生信息的list
     */
    public static void writeStudent(List<Student> lt) throws IOException {
//      获取当前工作路径
        String localWorkPath = System.getProperty("user.dir");
//       在当前工作路径下新建txt文件用来保存student信息
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(localWorkPath + "/student.txt"));
        oos.writeObject(lt);
        //        for (Student s:lt ){
//            oos.writeObject(s);
//        }
        System.out.println("学生信息保存成功!");
        oos.close();

    }

    /**
     * 从txt文件中读取学生信息
     * @return 保存学生信息的list
     */
    public static List<Student> readStudent() throws IOException, ClassNotFoundException {
        List<Student> lt = new LinkedList<>();
        //      获取当前工作路径
        String localWorkPath = System.getProperty("user.dir");
//      拼接保存文件路径
        File f = new File(localWorkPath + "/student.txt");
//        如果文件存在则读取文件内容
        if (f.exists()){
            ObjectInputStream oos = new ObjectInputStream(new FileInputStream(localWorkPath + "/student.txt"));
            Object object = oos.readObject();
            lt.addAll((List)object);
        }
        return lt;

    }

}


测试类:

package step1_task4_homework.student;


import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * student测试类
 */
public class StudentTest {
    public static void main(String[] args) {
//       尝试从文件中读取学生信息
        List<Student> lt = null;
        try {
            lt = StudentImpl.readStudent();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Boolean isExit = false;
        while (!isExit){
            int choose = StudentImpl.show();
//            根据界面选择来调用增删改查遍历方法
            switch (choose){
                case 1:
                    try {
                        StudentImpl.add(lt);
                    } catch (NumException e) {
                        e.printStackTrace();
                    } catch (AgeException e) {
                        e.printStackTrace();
                    }
                    break;
                case 2:
                    StudentImpl.delStu(lt);
                    break;
                case 3:
                    try {
                        StudentImpl.modifyStu(lt);
                    } catch (AgeException e) {
                        e.printStackTrace();
                    }
                    break;
                case 4:
                    StudentImpl.findStu(lt);
                    break;
                case 5:
                    StudentImpl.findAllStu(lt);
                    break;
                case 6:
                    System.out.println("退出登录。。。。。");
                    try {
                        StudentImpl.writeStudent(lt);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    isExit = true;
                    break;
                default:
                    System.out.println("请输入正确的序号!");
            }
        }
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值