zoukankan      html  css  js  c++  java
  • Bug调试专项训练一总结

    1.对文件中的内容进行排序bug处理

    错误代码

    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>() {
               @Override
               public int compare(Student o1, Student o2) {
                   int i = o2.getAge() - o1.getAge();
                   return i = i == 0 ? o2.getName().compareTo(o1.getName()) : i;
              }
          });
           //2:读取student.txt文件中的所有学生信息,并将每一条学生信息,按照逗号切分后,
           // 将切分出的姓名和年龄封装成学生对象,然后将学生对象添加到TreeSet集合中;
           FileReader fr = new FileReader("MyDemo_List_IO\student.txt");
           BufferedReader bfr = new BufferedReader(fr);
           String s;
           while ((s = bfr.readLine()) != null) {
               String[] split = s.split(",");
               String name = split[0];
               String age = split[1];
               Student stu = new Student(name, Integer.parseInt(age));
               set.add(stu);
          }
           FileWriter fw = new FileWriter("MyDemo_List_IO\student.txt");
           BufferedWriter bfw = new BufferedWriter(fw);
           //3:将TreeSet集合中的学生信息重新写回student.txt文件中即可;
           for (Student stu : set) {
               bfw.write(stu.getName() + "," + stu.getAge());
               bfw.newLine();
          }
           bfw.close();
           bfr.close();
           System.out.println("---------功能已经完成,请自行打开student.txt文件观察是否已经将学生信息按年龄降序排列了---------");
      }
    }

    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++操作:

    最终效果

     

  • 相关阅读:
    innerHTML和outerHTML的区别
    递归,汉诺塔
    js 中的 Math.ceil() Math.floor Math.round()
    JS中的异常exception
    CSS样式中visited,hover,active , focus这四个分别表示什么意思?
    用户在设置密码时,提醒请输入半角字符(vue+element+valid)
    设置用户密码时,将全角转换为半角
    后台返回对象数组,对象属性相同时,只取一个对象
    远程链接mongoDB robomongo
    mongodb 入坑
  • 原文地址:https://www.cnblogs.com/859630097com/p/14260385.html
Copyright © 2011-2022 走看看