题目:
基于学生信息管理系统增加以下两个功能:
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("请输入正确的序号!");
}
}
}
}