木子.249 2021-09-09 18:22 采纳率: 75%
浏览 152
已结题

第一次运行 好好的 第二次运行就报错

public class SutdentManager {

public static void main(String[] args) throws Exception {
    // 学生管理系统的主界面代码编写
    // c创建集合对象
    // ArrayList<Student> array = new ArrayList<Student>();

    // 定义持久储存的文件路径
    String fileName = "d:\\Student.txt";

    while (true) {
        // 主界面设置
        System.out.println("------欢迎来到学生管理系统,请选择------");
        System.out.println("1.查询学生信息");
        System.out.println("2.添加学生信息");
        System.out.println("3.删除学生信息");
        System.out.println("4.修改学生信息");
        System.out.println("5.退出");
        // 键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的选择");
        String number = sc.nextLine();
        // 用switch语句实现选择
        switch (number) {
        case "1":
            findallstudent(fileName);
            break;
        case "2":
            addstudent(fileName);
            break;
        case "3":
            deletestudent(fileName);
            break;
        case "4":
            modifystudent(fileName);
            break;
        case "5":
            System.out.println("(感谢您的使用,再见)");
            System.exit(0);// JVM退出
            break;

        default:
            System.out.println("(你输入的选择有误,请重新选择)");
            break;
        }
    }
}

// 从文本文件中读取到集合
public static void readData(String filename, ArrayList<Student> array) throws Exception {

    // 创建缓冲输入流对象
    BufferedReader br = new BufferedReader(new FileReader(filename));

    String line;
    while ((line = br.readLine()) != null) {
        String[] datas = line.split(",");
        Student s = new Student();
        s.setSnumber(datas[0]);
        s.setName(datas[1]);
        s.setGender(datas[2]);
        s.setAge(datas[3]);
        s.setAddress(datas[4]);
        array.add(s);

    }
    br.close();

}

// 从集合中的数据写入文件
public static void writerData(String fileName, ArrayList<Student> array) throws Exception {

    // 创建输出缓冲流对象
    BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));

    for (int i = 0; i < array.size(); i++) {
         Student s = array.get(i);
         StringBuilder sb = new StringBuilder();
         sb.append(s.getSnumber()).append("---").append(s.getName()).append("---").append(s.getGender()).append("---").append(s.getAge()).append("---").append(s.getAddress());

         bw.write(sb.toString());
         bw.newLine();
         bw.flush();
    }
         bw.close();
}

// 学生管理系统查看所有学生
public static void findallstudent(String fileName) throws Exception {

    // 添加集合对象
    ArrayList<Student> array = new ArrayList<Student>();

    // 先从文件中把数据读取到集合中
    readData(fileName, array);

    // 判断集合中是否有数据,如果没有 就给出提示 不继续往下执行
    if (array.size() == 0) {
        System.out.println("(对不起,目前没有学生信息,请添加 谢谢)");
        return;
    }

    // \t是一个tab键,用来加空格的
    System.out.println("学号\t姓名\t性别\t年龄\t居住的");
    for (int i = 0; i < array.size(); i++) {
        Student s = array.get(i);
        System.out.println(s.getSnumber() + "\t" + s.getName() + "\t" + s.getGender() + "\t" + s.getAge() + "\t"
                + s.getAddress());
    }

}

// 学生管理系统的添加学生
public static void addstudent(String fileName) throws Exception {
    // 添加集合对象
    ArrayList<Student> array = new ArrayList<Student>();

    // 先从文件中把数据读取到集合中
    readData(fileName, array);
    // 创建键盘录入对象
    Scanner sc = new Scanner(System.in);

    // 为了让snumber能够被访问到,定义在循环外面
    String snumber;

    while (true) {
        System.out.println("请输入学生学号");
        snumber = sc.nextLine();

        // 判断学号是否被占用
        // 定义一个标记
        boolean flag = false;
        // 遍历集合,得到每个学号
        for (int i = 0; i < array.size(); i++) {
            Student s = array.get(i);

            // 获取该学生的学号 和键盘录入的进行比较
            if (s.getSnumber().equalsIgnoreCase(snumber)) {
                flag = true;
                break;
            }
        }
        if (flag) {
            System.out.println("(您输入的学号已被占用,请重新输入)");
        } else {
            break;
        }

    }
    System.out.println("请输入学生姓名");
    String name = sc.nextLine();
    System.out.println("请输入学生性别");
    String gender = sc.nextLine();
    System.out.println("请输入学生年龄");
    String age = sc.nextLine();
    System.out.println("请输入学生居住的");
    String address = sc.nextLine();

    // 创建学生对象
    Student s = new Student();
    s.setSnumber(snumber);
    s.setName(name);
    s.setGender(gender);
    s.setAge(age);
    s.setAddress(address);

    // 对象添加到集合
    array.add(s);
    // 把数据中的集合重新写回到文件
    writerData(fileName, array);

    // 给出提示
    System.out.println("(添加学生成功)");

}

// 学生管理系统的删除学生
public static void deletestudent(String fileName) throws Exception {

    // 添加集合对象
    ArrayList<Student> array = new ArrayList<Student>();

    // 先从文件中把数据读取到集合中
    readData(fileName, array);

    // 删除学生的思路:键盘录入一个学号 到集合中去查找 看是否有学生使用,如果有就删除
    // 键盘录入对象
    Scanner sc = new Scanner(System.in);
    System.out.println("(请输入你要删除学生的学号)");
    String snumber = sc.nextLine();

    // 定义一个索引
    int index = -1;

    // 遍历集合
    for (int i = 0; i < array.size(); i++) {
        // 获取到集合中的每一个对象
        Student s = array.get(i);
        // 拿录入的学号和集合中的学好进行比较
        if (s.getSnumber().equalsIgnoreCase(snumber)) {
            index = i;
            break;
        }
    }

    if (index == -1) {
        System.out.println("(对不起,您输入的学号不存在,请重新输入)");
    } else {
        array.remove(index);

        // 把数据中的集合重新写回到文件
        writerData(fileName, array);
        System.out.println("(删除成功)");
    }

}

// 修改学生
public static void modifystudent(String fileName) throws Exception {

    // 添加集合对象
    ArrayList<Student> array = new ArrayList<Student>();

    // 先从文件中把数据读取到集合中
    readData(fileName, array);

    // 修改学生思路:键盘录入学号,到集合中查找是否存在,如果有就修改
    // 创建键盘录入
    Scanner sc = new Scanner(System.in);
    System.out.println("(请输入要修改的学生学号)");
    String snumber = sc.nextLine();

    // 定义一个索引
    int index = -1;

    // 遍历集合
    for (int i = 0; i < array.size(); i++) {
        // 获取每一个对象
        Student s = array.get(i);
        // 和录入的进行比较
        if (s.getSnumber().equalsIgnoreCase(snumber)) {
            index = i;
            break;
        }
    }

    if (index == -1) {
        System.out.println("(您要修改的学生信息不存在,,请重新输入)");
    } else {
        System.out.println("请输入新学生姓名");
        String name = sc.nextLine();
        System.out.println("请输入新学生性别");
        String gender = sc.nextLine();
        System.out.println("请输入新学生年龄");
        String age = sc.nextLine();
        System.out.println("请输入新学生居住的");
        String address = sc.nextLine();

        // 创建学生对象
        Student s = new Student();
        s.setSnumber(snumber);
        s.setName(name);
        s.setGender(gender);
        s.setAge(age);
        s.setAddress(address);

        // 对应集合
        array.set(index, s);
        // 把数据中的集合重新写回到文件
        writerData(fileName, array);

        // 结果
        System.out.println("(修改成功)");
    }

}

}

报错的:

线程“main”java.lang.ArrayIndexOutOfBoundsException中出现异常异常:1

位于com.lms.SutdentManager.readData(SutdentManager.java:80)

位于com.lms.SutdentManager.findallstudent(SutdentManager.java:116)

位于com.lms.SutdentManager.main(SutdentManager.java:46)

原文中的行数,文章的报错行数是24 58 94

选择哪个 那个的输入 输出 和 读取文件的set方法就报错

  • 写回答

2条回答 默认 最新

  • 离人散 2021-09-10 10:02
    关注

    这个报错提示的是不合法的索引访问数组是会出现这种错误,只要注意数组的界限,就可以避免了。你可以仔细去看看你的代码 研究一下readData方法里 当数组长度只有1的时候,你将学生信息加入数组时array时数组下标的问题。

    while ((line = br.readLine()) != null) {
                String[] datas = line.split(",");
                Student s = new Student();
                s.setSnumber(datas[0]);
                s.setName(datas[1]);
                s.setGender(datas[2]);
                s.setAge(datas[3]);
                s.setAddress(datas[4]);
                array.add(s);
            }
    
    

    虽然你的报错信息提示了24 58 94 可是24是报错是因为findallstudent方法而这个方法里调用了readData。94行也是 所以你报错的最主要原因就是readData方法里数组的下标界限越界。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月24日
  • 已采纳回答 9月16日
  • 修改了问题 9月9日
  • 修改了问题 9月9日
  • 展开全部

悬赏问题

  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测