Java学习的第三十天(JavaSE结束篇02_学生管理系统(集合+异常处理+对象流+递归输入判断))

一、学生管理系统的业务需求

1.需要有一个学生类,它有四个成员变量:ID 姓名 性别 班级
2.成员变量必须私有化,然后只能通过set方法赋值,通过get方法取值
3.通过set方法赋值时,如果输入的不是规定的内容通过throw抛异常进行处理
4.必须包含无参构造和有参构造方法
5.必须重写toString()方法--能够在输出对象名时不输出地址,而是里面的内容
6.必须重写hashcode()和equals()用来对集合去重
7.使用集合用来存储学生对象,使用集合中的方法去完成对学生对象中内容的操作
8.实现对学生信息的增删改查操作
9.使用对象流将集合中的内容也就是所有的学生对象保存至txt文件中
	这里注意:学生类必须实现Serializable,并使设置serialVersionUID一致
10.判断如果输入的类型不是相对应的类型,能够捕获异常并进行处理
11.当用户输入有误时,能够给出提示信息,并让用户重新输入正确的信息

二、学生管理系统的代码演示

1.一共三个.java文件--StudentManage.java --Student.java --StudentException

1.1 Student.java

package com.bianyiit.cast;

import java.io.Serializable;
import java.util.Objects;

public class Student implements Serializable {
    private static final long serialVersionUID =1L;
    //ID 姓名 性别 班级
    private String name;
    private int id;
    private String classname;
    private String sex;
    //生成get和set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        if(name.length()<=4){
            this.name = name;
        }else{
            //this.name = "xxx";
            throw new StudentException("提示:姓名不符合要求,请重新输入!");
        }
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        if(id>=1&&id<=100){
            this.id = id;
        }else{
            //this.id = 0;
            throw new StudentException("提示:您输入的ID不正确,只允许从0-100,请重新输入!");
        }
    }

    public String getClassname() {
        return classname;
    }

    public void setClassname(String classname) {
        if(classname.equals("102")||classname.equals("103")){
            this.classname = classname;
        }else{
            //this.classname = "null";
            throw new StudentException("提示:对不起,班级只能输入102/103,请重新输入!");
        }
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        if(sex.equals("男")||sex.equals("女")){
            this.sex = sex;
        }else{
            //this.sex = "不明";
            throw new StudentException("提示:对不起,性别只能输入男/女,请重新输入!");
        }
    }
    //无参构造方法
    public Student() {
    }
    //有参构造方法
    public Student(String name, int id, String classname, String sex) {
        this.name = name;
        this.id = id;
        this.classname = classname;
        this.sex = sex;
    }
    //重写equasls()

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                sex == student.sex &&
                Objects.equals(name, student.name) &&
                Objects.equals(classname, student.classname);
    }
    //重写hashcode()
    @Override
    public int hashCode() {
        return Objects.hash(name, id, classname, sex);
    }
    //重写toString()
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", classname='" + classname + '\'' +
                ", sex=" + sex +
                '}';
    }
}

1.2 StudentException.java

package com.bianyiit.cast;

public class StudentException extends RuntimeException {
    String message;
    public StudentException(String message){
        this.message=message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }
}

1.3 StudentManage

package com.bianyiit.cast;

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class StudentManage {
    public static void main(String[] args) throws Exception {
        ArrayList<Student> arr=new ArrayList<Student>();   //使用集合保存学生信息
        String filename="D:\\重要代码Demo\\文件IO对象\\学生管理系统\\Student.txt";
        while(true){
            System.out.println("----Welcome To Student Manage----");
            System.out.println("1.查看所有的学生信息");
            System.out.println("2.添加学生");
            System.out.println("3.删除学生");
            System.out.println("4.修改学生");
            System.out.println("5.退出系统");
            System.out.print("请输入您的选择[num]:");
            //扫描器
            Scanner sc=new Scanner(System.in);
            int i = sc.nextInt();
            //通过switch去实现各个功能
            switch (i){
                case 1:
                    FindAllStudent(filename);
                    break;
                case 2:
                    InsertStudent(filename);
                    break;
                case 3:
                    deleteStu(filename);
                    break;
                case 4:
                    changeStu(filename);
                    break;
                case 5:
                    System.out.println("已成功退出系统!!");
                    System.exit(0);   //退出系统
                    break;
                default:
                    break;
            }
        }
    }

	//查找学生信息
    public static void FindAllStudent(String filename) throws IOException, ClassNotFoundException {
        //从文件中读取存的对象
        ObjectInputStream oios = null;
        try {
            oios = new ObjectInputStream(new FileInputStream(filename));
        } catch (IOException e) {
            //e.printStackTrace();
        }
        ArrayList<Student> arr = new ArrayList<Student>();
        while(true){
            try {
                arr = (ArrayList<Student>) oios.readObject();
            } catch (Exception e) {
                //当出现异常的时候,代表读到末尾了,这是可以将整个读的步骤干掉
                //System.out.println("用异常来标识读取对象的结尾:"+e.getClass());
                break;
            }
        }
        System.out.println("-------------学生信息显示如下---------------");
        System.out.println("学号\t\t姓名\t\t性别\t\t班级\t\t");
        //遍历所有的学生对象
        for (int i = 0; i < arr.size(); i++) {
            Student student = arr.get(i);
            System.out.println(student.getId()+"\t\t\t"+student.getName()+"\t\t"+student.getSex()+"\t\t\t"+student.getClassname());
        }
        System.out.println("-------------------------------------------");
        System.out.println();
    }

	//添加学生信息
    public static void InsertStudent(String filename) throws Exception {
        ObjectInputStream oios = null;
        try {
            oios = new ObjectInputStream(new FileInputStream(filename));
            //System.out.println(oios);
        } catch (IOException e) {
            //e.printStackTrace();
        }
        ArrayList<Student> arr=new ArrayList<Student>();
        while(true){
            try {
                arr = (ArrayList<Student>) oios.readObject();
            } catch (Exception e) {
                //当出现异常的时候,代表读到末尾了,这是可以将整个读的步骤干掉
                //System.out.println("用异常来标识读取对象的结尾:"+e.getClass());
                break;
            }
        }
        if(arr.isEmpty()){
            /*int idcode;   //学号
            String name;  //姓名
            String sex;   //性别
            String classname; //班级*/
            //Scanner sc1=new Scanner(System.in);
            Student s=new Student();
            System.out.println("请输入您的学号!");
            inputIdMethod(s);
            System.out.println("请输入您的姓名!");
            inputNameMethod(s);
            System.out.println("请输入您的性别!");
            inputSexMethod(s);
            System.out.println("请输入您的班级!");
            inputClassNameMethod(s);
            //将Student添加进集合中
            arr.add(s);
            //给出添加成功的提示
            System.out.println("添加成功!");
            System.out.println();
            //将对象信息添加进文件中
            ObjectOutputStream ojos=new ObjectOutputStream(new FileOutputStream(filename));
            ojos.writeObject(arr);
        }else{
            Student s=new Student();
            int flag=-1;   //定义一个标识符 如果遍历完之后已经有该学生的学号则更改flag=1
            Scanner sc=new Scanner(System.in);
            int idcode=1;
            System.out.println("请输入您的学号!");
            do{
                try {
                    //Scanner sc=new Scanner(System.in);
                    idcode = sc.nextInt();
                    break;
                } catch (Exception e) {
                    //这里如果出异常了,sc里面的内容没有清空,导致会一直循环打印,不会使用输入语句输入
                    sc.next();
                    System.out.println("输入的学号不能为String类型的,必须为int类型的");
                    System.out.println("请再次输入您的学号!");
                }
            }while(true);
            //遍历集合中所有的元素
            for (int i = 0; i < arr.size(); i++) {
                Student s1 = arr.get(i);
                if(s1.getId()==idcode){
                    flag=1;
                    break;
                }
            }
            if(flag==1){    //与集合中已有的学生对象进行比较如果学号重复
                System.out.println("该学生学号已经存在,不允许添加相同学号的学生!!");
                System.out.println();
            }else{  //与集合中已有的学生对象进行比较如果学号不重复
                //创建一个学生对象
                //将学号不相同的学号加入数组
                try {
                    s.setId(idcode);
                } catch (StudentException e) {
                    System.out.println(e.getMessage());
                    System.out.println();
                    System.out.println("请重新输入您的学号");
                    inputIdMethod(s);
                }
                System.out.println("请输入您的姓名!");
                inputNameMethod(s);
                System.out.println("请输入您的性别!");
                inputSexMethod(s);
                System.out.println("请输入您的班级!");
                inputClassNameMethod(s);
                //将Student添加进集合中
                arr.add(s);
                //给出添加成功的提示
                System.out.println("添加成功!");
                System.out.println();
                //将对象信息添加进文件中
                ObjectOutputStream ojos=new ObjectOutputStream(new FileOutputStream(filename));
                ojos.writeObject(arr);
                ojos.close();
            }
        }
    }
    
    //删除学生信息
    public static void deleteStu(String filename) throws Exception {
        //从文件中读取存的对象
        ObjectInputStream oios = null;
        try {
            oios = new ObjectInputStream(new FileInputStream(filename));
        } catch (IOException e) {
            //e.printStackTrace();
        }
        ArrayList<Student> arr=new ArrayList<Student>();
        while(true){
            try {
                arr = (ArrayList<Student>) oios.readObject();
                oios.close();
            } catch (Exception e) {
                //当出现异常的时候,代表读到末尾了,这是可以将整个读的步骤干掉
                //System.out.println("用异常来标识读取对象的结尾:"+e.getClass());
                break;
            }
        }
        //遍历集合
        //如果集合里面没有元素
        if(arr.isEmpty()){
            System.out.println("集合为空,无法进行删除操作!!");
            System.out.println();
        }else{
            int delete=-1;  //定义一个标志用来标识需要删除的对象
            int flag=-1;
            int idcode;
            System.out.println("请输入您的学号!");
            Scanner sc=new Scanner(System.in);
            do{
                try {
                    //Scanner sc=new Scanner(System.in);
                    idcode = sc.nextInt();
                    break;
                } catch (Exception e) {
                    //这里如果出异常了,sc里面的内容没有清空,导致会一直循环打印,不会使用输入语句输入
                    sc.next();
                    System.out.println("输入的学号不能为String类型的,必须为int类型的");
                    System.out.println("请再次输入您的学号!");
                }
            }while(true);
            for (int i = 0; i < arr.size(); i++) {
                Student s1 = arr.get(i);
                if(s1.getId()==idcode){
                    flag=1;
                    delete=i;
                }
            }
            if(flag==1){
                Student student = arr.get(delete);
                arr.remove(student);
                System.out.println("已成功删除该学生!!");
                System.out.println();
            }else{
                System.out.println("系统里面不存在该学生,无法删除!!");
                System.out.println();
            }
            //将对象信息添加进文件中
            ObjectOutputStream ojos=new ObjectOutputStream(new FileOutputStream(filename));
            ojos.writeObject(arr);
            ojos.close();
        }
    }
    
    //修改学生信息
    public static void changeStu(String filename) throws Exception {
        //从文件中读取存的对象
        ObjectInputStream oios = null;
        try {
            oios = new ObjectInputStream(new FileInputStream(filename));
        } catch (IOException e) {
            //e.printStackTrace();
        }
        ArrayList<Student> arr=new ArrayList<Student>();
        while(true){
            try {
                arr = (ArrayList<Student>) oios.readObject();
            } catch (Exception e) {  //如果为空,直接抛最大的异常跳出,不执行上面那句话就行了
                //当出现异常的时候,代表读到末尾了,这是可以将整个读的步骤干掉
                //System.out.println("用异常来标识读取对象的结尾:"+e.getClass());
                break;
            }
        }
        //遍历集合
        //如果集合里面没有元素
        if(arr.isEmpty()){
            System.out.println("集合为空,无法进行修改操作!!");
            System.out.println();
        }else{
            int delete=-1;  //定义一个标志用来标识需要删除的对象
            System.out.println("请输入您的学号!");
            int flag=-1;
            int idcode;
            Scanner sc=new Scanner(System.in);
            do{
                try {
                    //Scanner sc=new Scanner(System.in);
                    idcode = sc.nextInt();
                    break;
                } catch (Exception e) {
                    //这里如果出异常了,sc里面的内容没有清空,导致会一直循环打印,不会使用输入语句输入
                    sc.next();
                    System.out.println("输入的学号不能为String类型的,必须为int类型的");
                    System.out.println("请再次输入您的学号!");
                }
            }while(true);
            for (int i = 0; i < arr.size(); i++) {
                Student s1 = arr.get(i);
                if(s1.getId()==idcode){
                    flag=1;
                    delete=i;
                }
            }
            if(flag==1){
                Student student = arr.get(delete);
                System.out.print("请输入修改的学生的姓名:");
                inputNameMethod(student);
                System.out.print("请输入修改的学生的性别:");
                inputSexMethod(student);
                System.out.print("请输入修改的学生的班级:");
                inputClassNameMethod(student);
                arr.set(delete,student);
                System.out.println("学生信息修改成功!!");
                System.out.println();
                //将对象信息添加进文件中
                ObjectOutputStream ojos=new ObjectOutputStream(new FileOutputStream(filename));
                ojos.writeObject(arr);
                ojos.close();
            }else{
                System.out.println("系统里面不存在该学生,无法修改!!");
                System.out.println();
            }
        }
    }

    //输入学生学号的方法
    private static void inputIdMethod(Student s) {
        Scanner sc=new Scanner(System.in);
        int idcode;
        do{
            try {
                idcode = sc.nextInt();
                break;
            } catch (Exception e) {
                //这里如果出异常了,sc里面的内容没有清空,导致会一直循环打印,不会使用输入语句输入
                sc.next();
                System.out.println("输入的学号不能为String类型的,必须为int类型的");
                System.out.println("请再次输入您的学号!");
            }
        }while(true);
        try {
            s.setId(idcode);
            //System.out.println(s);
        } catch (StudentException e) {
            System.out.println(e.getMessage());
            System.out.println();
            System.out.println("请重新输入您的学号");
            inputIdMethod(s);
        }
    }
    //输入学生姓名的方法
    private static void inputNameMethod(Student s){
        Scanner sc=new Scanner(System.in);
        String name;
        name = sc.next();
        try {
            s.setName(name);
            //System.out.println(s);
        } catch (StudentException e) {
            System.out.println(e.getMessage());
            System.out.println();
            System.out.println("请重新输入您的姓名");
            inputNameMethod(s);
        }
    }
    //输入学生性别的方法
    private static void inputSexMethod(Student s){
        Scanner sc=new Scanner(System.in);
        String sex=null;
        sex = sc.next();
        try {
            s.setSex(sex);
            //System.out.println(s);
        } catch (StudentException e) {
            System.out.println(e.getMessage());
            System.out.println();
            System.out.println("请重新输入您的性别");
            inputSexMethod(s);
        }
    }
    //输入学生班级的方法
    private static void inputClassNameMethod(Student s){
        Scanner sc=new Scanner(System.in);
        String classname;
        classname = sc.next();
        try {
            s.setClassname(classname);
            //System.out.println(s);
        } catch (StudentException e) {
            System.out.println(e.getMessage());
            System.out.println();
            System.out.println("请重新输入您的班级");
            inputClassNameMethod(s);
        }
    }
}

运行与测试

"C:\Program Files\Java\jdk1.8.0_231\bin\java.exe"
----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:1
-------------学生信息显示如下---------------
学号		姓名		性别		班级		
-------------------------------------------

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:2
请输入您的学号!
张三
输入的学号不能为String类型的,必须为int类型的
请再次输入您的学号!
-1
提示:您输入的ID不正确,只允许从0-100,请重新输入!

请重新输入您的学号
1
请输入您的姓名!
张三
请输入您的性别!
神
提示:对不起,性别只能输入男/女,请重新输入!

请重新输入您的性别
男
请输入您的班级!
105
提示:对不起,班级只能输入102/103,请重新输入!

请重新输入您的班级
102
添加成功!

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:1
-------------学生信息显示如下---------------
学号		姓名		性别		班级		
1			张三		男			102
-------------------------------------------

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:2
请输入您的学号!
1
该学生学号已经存在,不允许添加相同学号的学生!!

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:2
请输入您的学号!
2
请输入您的姓名!
欧阳张三李四
提示:姓名不符合要求,请重新输入!

请重新输入您的姓名
李四
请输入您的性别!
女
请输入您的班级!
103
添加成功!

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:1
-------------学生信息显示如下---------------
学号		姓名		性别		班级		
1			张三		男			102
2			李四		女			103
-------------------------------------------

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:4
请输入您的学号!
3
系统里面不存在该学生,无法修改!!

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:4
请输入您的学号!
1
请输入修改的学生的姓名:小明
请输入修改的学生的性别:男
请输入修改的学生的班级:103
学生信息修改成功!!

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:1
-------------学生信息显示如下---------------
学号		姓名		性别		班级		
1			小明		男			103
2			李四		女			103
-------------------------------------------

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:3
请输入您的学号!
5
系统里面不存在该学生,无法删除!!

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:3
请输入您的学号!
2
已成功删除该学生!!

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:1
-------------学生信息显示如下---------------
学号		姓名		性别		班级		
1			小明		男			103
-------------------------------------------

----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:5
已成功退出系统!!
发布了73 篇原创文章 · 获赞 11 · 访问量 2459

猜你喜欢

转载自blog.csdn.net/weixin_43908333/article/details/103356039