• 第10周-异常与多线程


    1. 本周学习总结

    1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容。

    异常(补充):

    • 不要滥用异常
      1) 异常会带来程序性能的降低,不要用异常代替正常的程序流程
      2) 显而易见的异常可以在编写程序的时候自己添加条件
    • 调试技术
      调试与异常是相关的
      1)调试方法
      ——使用System.out.println("x="+x);打印变量值
      ——每个需要测试的类中放一个main方法
      ——JUnit(单元测试框架)
      ——日志(现在用的更多使用第三方日志框架Log4j2)
      ——Throwable的printStackTrace方法(可看)
      ——System.err...
      ——将错误信息保存到文件中(java Test 2 >errors.txt)
      2)调试器的使用
      ——断点的设置与清除
      ——使用快捷键进调试

    多线程:

    2. 书面作业

    ——本次PTA作业题集异常多线程

    1. finally——题目4-2

    1.1 截图你的提交结果(出现学号)

    1.2 4-2中 finally中捕获异常需要注意什么?

    答: 在4-2中,根据题意——无论向系统申请资源成功与否都要释放资源,因此释放资源的相关代码要放在finally中;无异常时打印resource release success,在捕获异常成功时用System.out.println(e)打印释放资源错误信息。

    2. 用异常改进ArrayIntegerStack——题目4-3

    2.1 截图你的提交结果(出现学号)

    2.2 实验总结

    我的总结: 本题考查运用异常,在已经编好的程序中添加出错时出异常的功能。 使用异常来提示用户出错,可以让用户清晰地明白哪个地方甚至哪个自己输入的点有错,从而注意或改进,比起只是返回 null的实用性大大增强了;所以本题也更好的启发我如何运用异常来改进自己的程序,增加实用性。

    3. 自定义异常——题目5-4

    4.1 截图你的提交结果(出现学号)

    4.2 自定义异常有哪几个关键点?

    答:

    • 自定义异常是 Throwable类的子类;
    • 要让该异常明确提示用户错误的原因;
    • 自定义的异常是属于 Unchecked Exception还是 Checked Exception(一般继承 Exception);
    • 根据程序需求自定义异常,不要滥用。

    4. 读取文件并组装对象——*实验任务书中中的题目3:读取文件并组装对象 *

    给出关键代码(需出现你的学号)

    4.1 跳过错误行:
    • 相关代码
    try {
        String a1 = lineScanner.next();// 姓名
        String a2 = lineScanner.next();// 身份证号
        String a3 = lineScanner.next();// 性别
        String a4 = lineScanner.next();// 年龄
        String a5 = lineScanner.next();// 地址
        while (lineScanner.hasNext()) {// 谨防地址只有一段
            a5 += lineScanner.next();
        }
        System.out.println(a1 + a2 + a3 + a4 + a5);
    } catch (Exception e) {
    
    }
    
    4.2 定位错误:
    • 相关代码
    public class ReadFileUsingScanner201521123094 {
        public static void main(String[] args) throws FileNotFoundException {
            List<User> student = new ArrayList<User>();
            Scanner in = new Scanner(new File("身份证号.txt"));// 为myfile.txt这个File创建一个扫描器in
            while (in.hasNextLine()) {
            try {
                String line = in.nextLine();// 读出myfile.txt的下一行
                Scanner lineScanner = new Scanner(line);// 为每一行建立一个扫描器
                // System.out.println("lineScanner="+lineScanner);
                lineScanner.useDelimiter(" ");// 使用空格作为分隔符
                // System.out.println(line);
                try {
                    String a1 = lineScanner.next();// 姓名
    		String a2 = lineScanner.next();// 身份证号
    		String a3 = lineScanner.next();// 性别
    		String a4 = lineScanner.next();// 年龄
    		String a5 = lineScanner.next();// 地址
    		while (lineScanner.hasNext()) {// 谨防地址只有一段
    		    a5 += lineScanner.next();
    		}
    		System.out.println(a1 + a2 + a3 + a4 + a5);
    
    		if (a1.length() == 0 || a1.length() > 10) {
    		    throw new NoNameException("没有填写姓名");
    		}
    		if (a2.length() == 0) {
    		    throw new NoIDcardException("没有填写身份证号码");
    		}
    		if (!a3.equals("男") && !a3.equals("女")) {
    		    throw new NoGenderException("没有填写性别");
    		}
    		student.add(new User(a1, a2, a3, Integer.parseInt(a4), a5));
                } catch (NumberFormatException e) {
                    System.err.println(line + "
    " + e + " :信息格式错误");
                } catch (NoSuchElementException e) {
                    System.err.println(line + "
    " + e + " :信息多处缺失");
                } catch (Exception e) {
                    System.err.println(line + "
    " + e);
                    continue;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    ......
    }
    
    4.3 按年龄排序:
    • 相关代码
    List<User> student = new ArrayList<User>();
    
    Collections.sort(student, new Comparator<User>() {
        @Override
        public int compare(User o1, User o2) {
            return o1.getAge() - o2.getAge();
        }
    });
    for (User user : student) {
        System.out.println(user.toString());
    }
    
    

    5. 学会使用Eclipse进行调试——观看相关调试视频

    5.1 简述使用Eclipse进行调试需要几步?

    答:
    (1)在程序可能发生错误的地方设置断点:双击可能出错行数前的空白位置。
    (2)启动调试模式:点击“昆虫”图标,进入Eclipse专门进行调试的debug perspective。
    (3)查看状态值:在debug模式中在可能出现错误的行数上一一检查。
    (4)清除所有断点,结束该程序。

    5.2 调试时F5, F6, F7快捷键各有什么不同?什么情况该使用哪个快捷键?

    答:

    F5快捷键:跳入函数或方法中(step into)——问题出现在这个方法中,跳入调试
    F6快捷键:跳过这个函数或语句(step over)——确定问题不是出现在当前语句,跳过这个语句
    F7快捷键:从函数中跳出(step return)——确定问题不是出现在这个函数中,且函数语句多,一行行跳出不现实
    

    5.3 除了Eclipse的调试器,你还使用什么方法调试程序?

    答:

    (1)根据系统崩溃时出现的提示,在那一行或者几行进行检查,看是否能够解决错误。
    (2)新学习的System.out.println()调试。
    

    5.4 选做:实验任务书中的题目5:使用Eclipse进行调试中的选做——使用Eclipse调试技巧,调试MessageBoard.zip中的系统直至可以正常运行。

    • 错误点1:没有将用户名和密码传入mmm


    • 修改:
      new User(name, pas);改成mmm.setUser(new User(name, pas));
      将name和pas的输入形式改为sc.next(); 否则出现如下错误:

    • 错误点2:没有传入用户完整的信息,mealist的size为0



    • 修改:
      meslist.add(new Message(mes,user.getUsername()));改成meslist.add(new Message(mes, user));

    • 正常运行结果

    6. 题集多线程

    6.1 程序填空3-1、3-2。(截图提交结果,出现你的学号)

    6.2 函数4-1(Thread)、4-2(Runnable)(截图提交结果,出现你的学号)

    6.3 函数4-3(Runnable与匿名内部类)(截图提交结果,出现你的学号),并使用Labmda表达式改写。

    Labmda表达式改写代码

    6.4 实验总结

    • 程序填空3-1:本题考查——守护线程。
      前台线程死亡,守护线程自动结束。使用setDaemon()将t1设为守护线程。
    • 程序填空3-2:本题考查——等待线程终止。
      使用join()方法使t1结束后才执行主线程。
    • 函数4-1:本题考查——多线程的创建。
      MyThread类继承自Thread,其中定义run()方法,操作为:循环输出。(自定义循环次数)。
    • 函数4-2:本题考查——Runnable与停止线程。
      定义的MonitorTask类实现Runnable接口;一开始无从下手,然后老师改了题目就按部就班的做;注意因为对每个传入的word只能检查一遍,检查过后的word要置空。
    • 函数4-3:本题考查——Runnable匿名内部类的写法。
      一开始就忘了匿名内部类格式,通过PPT回顾后,加深知识点的记忆。这题还有一点不同new Runnable()的放置——Thread t1 = new Thread(new Runnable()...

    7. 源代码阅读:多线程程序 BounceThread

    7.1 哪个类是支持多线程的类,它实现了什么接口。这个类做了些什么?

    答:

    (1)BallRunnable类是支持多线程的类;
    (2)BallRunnable类实现了Runnable接口;
    (3)BallRunnable类运行弹球。
        ① 声明属性;② run()方法:(循环1000次)move(小球移动的函数)->重画组件->暂停5milliseconds
    

    7.2 Ball.java这个程序只做了两件事,这两件事分别是什么?

    答:

    (1)定义了move()方法:移动球的位置,如果达到边缘值,使其反向运动
    (2)定义了getShape()方法:获取小球的大小和位置
    

    7.3 BallComponent也只做了两件事,这两件事分别是什么?

    答:

    (1)定义了add()方法:添加小球
    (2)定义了paintComponent()方法:画出小球
    

    7.4 BounceThread中,什么时候启动了新线程?

    答:

    在BounceFrame中的addBall()方法中的t1.start()启动线程。
    

    7.5 这个程序是如何实现?一个大致的执行流程是什么?

    答:大致流程

    (1)搭建图形界面
    (2)点击start按钮,运行小球
    (3)每点击一次就出现一个小球(点击次数不超过1000)
    (4)小球到一定步数时就停止在界面上
    (5)点击close按钮,停止运行
    

    8. 购物车系统中的多线程

    8.1 购物车系统中可能存在哪些多线程问题?

    答:多用户多线程

    • 用户同时登陆购物车系统
    • 用户同时购买最后一件物品

    9. 选做:单元测试JUint4——实验任务书中的题目6:单元测试使用JUnit4(待)

    • 自己编写的冒泡排序
    
    
    • 系统类库的Arrays.sort()
    
    

    10. 选做:JavaFX入门(待)

    ——如果未完成作业1、2的请先完成。如果已完成的请完成第五部分:将数据用 XML 格式存储或第六部分:统计图(漂亮的图表)。注:内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建。

    3. 码云上代码提交记录

    ——题目集:异常、多线程(3-1, 3-2, 4-1, 4-2, 4-3)

    3.1. 码云代码提交记录

    ——在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

    4. 选做:课外阅读(待)

    4.1 Java Concurrent Animated

    4.2 线程的高级知识笔记

    阅读理解

  • 相关阅读:
    浏览器缓存机制
    es6笔记(6) Iterator 和 for...of循环
    es6笔记(3.1)三个点的“...”的作用
    es6笔记(5)Map数据结构
    es6笔记(4) Set数据结构
    SpringBoot事件监听
    SpringBoot入门
    五大常用算法之三贪心算法
    五种常用算法之二:动态规划算法
    五大常用算法之一:分治算法
  • 原文地址:https://www.cnblogs.com/whting/p/6759541.html
Copyright © 2020-2023  润新知