• 20155318 2016-2017-2 《Java程序设计》第五周学习总结


    20155318 2016-2017-2 《Java程序设计》第五周学习总结

    教材学习内容总结

    try...catch

    1. 键盘输入利用java.util.Scanner,Scanner 名 new Scanner(System.in);…int number=名.nextInt();将用户输入的下一个字符剖析为int型。
    2. Java中所有错误都会被打包为对象,这些对象都可抛出,都继承自java.lang.Throwable类,该类又分为java.lang.Errorjava.lang.Exception(异常处理)两个子类
    3. try{…}catch (…){…}先尝试try区块中的代码,如果错误就和catch括号中的错误类型做比较,相同时执行catch区块的代码。

    异常继承架构

    1. catch异常后的区块内容重复了,可以使用多重捕捉语法如下:
    try{
        ...
    }catch(IOEeception | InterruptedException | ClassCastException e)
    {
        e.printStackTrace();
    }
    
    1. catch括号中列出的异常不得有继承关系,否则会发生编译错误。如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块永远不会被执行。
    2. FileInputStream可以指定档名来开启与读取文档内容,但是在创建时会FileNotFoundException错误。抛出受检异常表示客户端有能力且应处理异常,必须在方法上使用throws声明。
    3. 无论try区块中有无异常发生,若撰写有finally区块,则finally区块一定会被执行。

    关闭资源

    1. try with resources
    2. java.lang.AutoCloseable

    collection、List、Set、Queue

    1. List是一种Collection,作用是收集对象,并以索引方式保留收集的对象顺序,包括:
      • ArrayList特性:用数组搜索对象,速度快,适合排序
      • LinkedList特性:链接结构,利于调整索引顺序
    2. Set:判断对象是否重复时会调用hashCode()和equals()方法,且必须同时操作
    3. Queue:Queue继承自Collection,Queue定义了自己的offer()、poll()与peek()等方法,操作失败时会返回特定值
    4. iterator()方法定义在Collection接口中,会返回java.util.Iterator接口的操作对象,这个对象包括了Collection收集的所有对象;增强式for循环还可以运用在操作Iterable接口的对象上。
    5. Map操作类为java.util.HashMap与java.util.TreeMap

    教材学习中的问题和解决过程

    • 问题1:try区块中有异常发生时,若撰写有finally区块是否会被执行,如果程序中包含return,final区块会怎么执行?
    • 解决方案:如果流程中先return了,那么finally区块会先执行完后,在将值返回。代码及程序运行结果如下:
    public class FinallyDemo{
    public static void main(String[] args){
    System.out.println(test(true));
    }
    static int test(boolean flag){
    try{
        if(flag){
            return 1;
        }
    }finally{
        System.out.println("finally...");
    }
    return 0;
    }
    }
    

    • 问题2:Lambda表达式:
    • 解决方案:Lambda表达式:Request request=()->out.printf("处理数据 %f",Math.random());Lambda表达式的语法省略了接口类型和方法名称。—>左边是参数列,右边是方法本体。编译程序可以由Request request的声明中得知语法上被省略的信息。
    import java.util.*;
    
    interface Request2
    {
        void execute();
    }
    
    public class RequestQueue2
    {
        public static void main (String[] args)
        {
            Queue<Request2>requests = new LinkedList<>();
            offerRequestTo(requests);
            process(requests);
        }
        static void offerRequestTo(Queue<Request2>requests)
        {
            for (int i = 1; i < 6;i++)
            {
                requests.offer
                        (() -> System.out.printf("处理数据%f%n",Math.random()));
            }
        }
    
        static void process(Queue<Request2>requests)
        {
            while(requests.peek() != null)
            {
                Request2 request = requests.poll();
                request.execute();
            }
        }
    }
    
    • 问题3:受检异常
    • 解决方案:需要注意如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块永远不会被执行。总结为:子类不能比父类抛出更大的异常。这个问题通过看了狄惟佳同学的博客得以解决。
    1. 子类覆盖父类方法是,父类方法抛出异常:子类的覆盖方法可以不抛出异常,或者抛出父类方法的异常。2. 父类方法抛出了多个异常,子类覆盖方法时,只能抛出父类异常的子集。3. 父类没有抛出异常,则子类不可抛出异常。若子类发生非运行时异常,需要进行try-catch处理,不能抛出。4. 子类不能比父类抛出更大的异常。

    代码调试中的问题和解决过程

    • 问题1:用Idea时之前的代码编译未通过,导致后来的代码也不能运行。
    • 解决方案:除了删除之前的错误代码还没有找到合适的解决方法。
    • 问题2:finally块中的代码一定会被执行吗?
    • 解决方案:参考话说finally块中的代码一定会执行吗?这篇博客,首先测试finally的代码是否会执行。
    public class TestFinally {
        public static void main(String[] args) {
            try{
                System.out.printf("nomal");
            }catch (Exception ex){
                System.out.printf("Exception");
            }finally {
                System.out.printf("Finally");
            }
        }
    }
    

    执行结果:

    在try或是catch块中使用了return语句,将代码稍作修改:

    public static void main(String[] args) {
            try{
                System.out.printf("nomal");
            }catch (Exception ex){
                System.out.printf("Exception");
                return;
            }finally {
                System.out.printf("Finally");
            }
        }
    

    执行结果:finally中的代码还是执行了

    再次简单修改代码:

    public static void main(String[] args) {
            try{
                System.out.printf("nomal");
                System.exit(0);
            }catch (Exception ex){
                System.out.printf("Exception");
                System.exit(0);
            }finally {
                System.out.printf("Finally");
            }
        }
    

    运行代码,结果为:System.exit()终止了JVM,finally不执行。

    • 结论:finally不一定都会执行,在不终止JVM的情况下,finally中的代码一定会执行。
    • 问题3:书上p269Students按照书上在IDEA中输入后显示有错误Cannot resolve symbol 'set'
    • 解决方案:书上印刷有错误,将最后一句中的set改为students即可运行成功。

    代码托管

    • 代码提交及代码量截图:

    上周考试错题总结

    • 错题1::被声明为protected的方法,只能中继承后的子类中访问。(X)

    • 解决:参考这个图可知除被本类或者派生类(子类)的成员函数访问外,还可以被本包内所有类访问

    • 错题2:父类的protected方法,在子类中可以override为public的方法。(OK)

    • 解决:方法的重写必须满足以下要求(从方法的五要素来分析):

    1. 要有继承;
    2. 方法名,参数列表要相同;
    3. 访问修饰符不能比父类窄
    • 也就是说,父类的public方法在重写时,访问修饰符必须是public,因为public的范围最大,否则就不构成方法的重写,例如:对于父类protected的方法,在重写时可以用protected或public来修饰。搜索
    1. 抛出的异常不能比父类更宽泛;
    2. 返回类型要比父类的小或相同。
    • 错题3:Math中的abs()方法可以Override.(X)
    • 未解决
    • 错题4:XX是一个引用型变量,System.out.println(XX)等价于System.out.println(XX.toString()). (OK)
    • 错题5:实现一个类中的equals()方法时,一定要同时实现(hashCode())方法
    • 解决方案
    • 错题6:面向对象中,设计经验可以用(设计模式)表达

    结对及互评

    点评模板:

    • 基于评分标准,我给本博客打分:9分。得分情况如下:
    1. 正确使用Markdown语法,+1
    2. 模板中的要素齐全,+1
    3. 教材学习中的问题和解决过程, +3
    4. 代码调试中的问题和解决过程, +3
    5. 本周有效代码超过300分行的+2
    6. 其他加分
      • 进度条中记录学习时间与改进情况的+1
      • 有动手写新代码+1

    点评过的同学博客和代码

    其他感悟

    本周因为准备二级的原因,代码敲得有些少,从周日才开始学习Java,下周还是会利用平时的时间学习。慢慢找到了平时测试的套路,但是动手实践还是很少,独自编写一个新学的程序还是有一定困难。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 50/100 1/1 24/24 安装学习Java的一系列软件
    第二周 250/300 1/2 30/54 了解Java的基本语法
    第三周 552/852 1/3 16/60 了解Java是面向对象的语言
    第四周 717/1569 1/4 10/70 了解Java继承与接口
    第五周 495/2064 1/5 6/76 了解异常处理,学会使用Collection收集对象

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    参考资料

  • 相关阅读:
    ASCII,Unicode 和 UTF-8
    ASCII,Unicode 和 UTF-8
    043_JVM——JVM是什么鬼啊?他与操作系统是什么关系?
    042_杂谈——编程语言的发展
    042_线程——我们写的代码,为什么我从来没有线程呢?
    041_ssm——/与/*与*.do的区别?
    040_HTTP——为什么会有get与post两种请求?
    039_Servlet——SpringMVC中怎么不见Servlet呢?我们写的Controller都是普通类,Servlet藏到了那里?
    038_JVM——怎么查看对象的内存大小?
    037_JVM——java中的类加载器是怎么运行的?
  • 原文地址:https://www.cnblogs.com/lxy1997/p/6624175.html
Copyright © 2020-2023  润新知