错误代码
package com.itheima.app;
import com.itheima.domain.Student;
import java.io.*;
import java.util.TreeSet;
/*
需求:
找出下面代码中存在的bug并改正,使之能正常执行并完成对文件中的用户信息按年龄降序排列的功能;(相同年龄的同学按姓名排序)
具体要求:
代码运行之后,需要将student.txt文件中的信息按照用户年龄降序排列,不能丢失任何一个人的信息;
思路分析:
1:创建TreeSet集合,并编写学生对象的排序规则;
2:读取student.txt文件中的所有学生信息,并将每一条学生信息,按照逗号切分后,将切分出的姓名和年龄封装成学生对象,然后将学生对象添加到TreeSet集合中;
3:将TreeSet集合中的学生信息重新写回student.txt文件中即可;
*/
public class MyController {
public static void main(String[] args) {
//1:创建TreeSet集合,并编写学生对象的排序规则;
TreeSet<Student> set = new TreeSet<>();
//2:读取student.txt文件中的所有学生信息,并将每一条学生信息,按照逗号切分后,
// 将切分出的姓名和年龄封装成学生对象,然后将学生对象添加到TreeSet集合中;
FileReader fr = new FileReader("MyDemo_List_IO\student.txt");
FileWriter fw = new FileWriter("MyDemo_List_IO\student.txt");
BufferedReader bfr = new BufferedReader(fr);
BufferedWriter bfw = new BufferedWriter(fw);
String s;
while ((s = bfr.readLine()) != null) {
String[] split = s.split(",");
String name = split[0];
String age = split[1];
Student stu = new Student(name, age);
set.add(stu);
}
//3:将TreeSet集合中的学生信息重新写回student.txt文件中即可;
for (Student stu : set) {
bfw.write(stu.getName()+","+stu.getAge());
}
bfw.close();
bfr.close();
System.out.println("---------功能已经完成,请自行打开student.txt文件观察是否已经将学生信息按年龄降序排列了---------");
}
}
package com.itheima.domain;
/*
学生模型类,此类的内容不允许修改!!!!!
*/
public class Student {
private String name;
private int age;// 年龄就是int类型,不许将年龄修改为String类型!!!!
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
数据:
Bug分析:
1.编译时错误
原因分析:
FileReader,readLine异常:原因是没有对异常进行抛出或者try/catch
age变量异常:原因,切割后为字符串类型,而年龄是int类型,所以类型错误,需要将age转换为int类型
处理方案:
2.运行错误:
路径错误:
错误信息:
报出以下错误:FileNotFoundException: MyDemo_List_IOstudent.txt (系统找不到指定的文件。)
报出此错误,说明我们的文件没有在项目下,虚拟机读取不到,检查文件的路径发现在文件夹下,所以修改文件的存取路径,将student.txt路径改到模块下
原路径:
修改后:
3.再次运行文件丢失问题:
通过dbug发现我们集合中为null,读取文件没有存入到集合中
原因:
因为只要创建字符输出流对象,就会先对原有文件进行清空,索引我们还没将数据存储到集合,数据已经被清空了,造成了文件丢失.
解决方案:
字符输出流对象创建到数据成功添加到集合之后
4.再次运行报出排序错误:
原因分析:
因为使用的是TreeSet集合,需要制定排序规则,要求降序,所以我们两种方式可以实现(自然排序/比较器排序),此处我选用的比较器排序
运行效果:
5.解决没有换行
因为没有换行所以为满足题目要求还需添加换行
6.最终效果
7.调试之后代码
package com.itheima.app;
import com.itheima.domain.Student;
import java.io.*;
import java.lang.ref.Cleaner;
import java.util.Comparator;
import java.util.TreeSet;
/*
需求:
找出下面代码中存在的bug并改正,使之能正常执行并完成对文件中的用户信息按年龄降序排列的功能;(相同年龄的同学按姓名排序)
具体要求:
代码运行之后,需要将student.txt文件中的信息按照用户年龄降序排列,不能丢失任何一个人的信息;
思路分析:
1:创建TreeSet集合,并编写学生对象的排序规则;
2:读取student.txt文件中的所有学生信息,并将每一条学生信息,按照逗号切分后,将切分出的姓名和年龄封装成学生对象,然后将学生对象添加到TreeSet集合中;
3:将TreeSet集合中的学生信息重新写回student.txt文件中即可;
*/
public class MyController {
public static void main(String[] args) throws IOException {
//1:创建TreeSet集合,并编写学生对象的排序规则;
TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {
2.随机点名器bug代码处理
错误代码
package com.itheima.demo;
import com.itheima.domain.Student;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class RandomStu {
//定义集合,并添加原始数据
private static ArrayList<Student> list=new ArrayList<>();
{
list.add(new Student("张三",18));
list.add(new Student("李四",19));
list.add(new Student("王五",20));
list.add(new Student("赵六",21));
list.add(new Student("田七",22));
//随机打乱集合中的元素顺序
Collections.shuffle(list);
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int i=1;
while (true){
System.out.println("回车键可查看被点到的同学...");
//下面这一行代码起到的作用可以让while循环每次循环到这里的时候,停下来,等待键盘输入任意内容后继续运行,输入什么都无所谓,关键是能让循环等待键盘输入
sc.nextLine();
if(list.size()==0){
System.out.println("所有学生已经全部点名一遍了,请重新运行程序,拜拜!");
break;
}
//删除集合中的最后一个元素
Student stu = list.remove(list.size());
System.out.println("今日第"+i +"位点到的学生姓名是:"+stu.getName()+",年龄是:"+stu.getAge());
}
}
}
package com.itheima.domain;
/*
学生模型类
*/
public class Student {
private String name;
private int age;
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
原文件:
张三
李四
王五
赵六
田七
bug分析
1.编译时期错误
异常原因:
1.javabean中没有提供带参构造方法
2.解决方法:补全带参构造
2.运行错误
异常状态
无法进入循环点名程序直接结束
首次调试
给代码块加Static静态关键字
索引越界异常信息
出现33行索引越界异常
33行内容:
索引越界原因分析
因为size是集合长度,长度是从1开始的,而索引是从0开始的。所以进行-1操作
解决索引越界
测试效果:
i为1异常分析
查看代码发现代码中没有++操作,所以i一直为1
解决方案
在打印输出之后进行i++操作:
最终效果