20145129 《Java程序设计》第5周学习总结

20145129 《Java程序设计》第5周学习总结

教材学习内容总结

  • 语法与继承架构
    • 使用try、catch
      • Java中所有错误都会被打包为对象,可以尝试(try)捕捉(catch)代表错误的对象后做一些处理。
      • 运用try、catch,在错误发生时显示更友好的错误信息。
      • 错误在捕捉处理后,尝试恢复程序正常执行流程。
    • 异常继承架构
      • 错误会被包装为对象,这些对象是可抛出的,因此设计错误对象都继承自java.lang.Throwable类。
      • Throwable定义了取得错误信息堆栈追踪等方法,它有两个子类:java.lang.Error与java.lang.Exception。
      • Error与其子类实例代表严重系统错误,如硬件层面错误、JVM错误或内存不足等问题。虽可以使用try、catch处理,但并不建议,发生严重错误时,Java应用程序本身是无力回复的。
      • 程序设计本身的错误,建议使用Exception或其子类实例来表现,所以通常称错误处理为异常处理。
      • 单就语法与继承构架上来说,如果某个方法声明会抛出Throwable或子类实例,只要不是属于Error、java.lang.RuntimeException或其子类实例,就必须明确使用try、catch语法处理,或者使用throws声明这个方法会抛出异常,否则编译失败。
      • IOException是Exception的直接子类,所以编译程序要求明确使用语法加以处理。
      • 受检异常:Exception或其子对象,但非属于RuntimeException或其子对象。
      • 非受检异常:属于RuntimeException衍生出来的类实例,代表API设计者实现某方法时,某些条件成立时引发错误,而且认为API客户端应该在调用方法前做好检查,避免引发错误,编译程序不会强迫一定得在语法上加以处理。
      • catch括号中列出的异常不能有异常关系,否则会发生编译错误。
    • 要抓还是要拋
      • 若抛出受检异常表示认为客户端有能力且应处理异常,此时必须在方法上使用throws声明。
      • 若抛出非受检异常表示认为客户端调用方法的时机出错了,要求客户端修正这个漏洞再来调用方法,此时就不使用throws声明。
      • throws声明部分会是API操作接口的一部分,客户端不用查看原始代码,从API文件上就能直接得知,该方法可能抛出哪些异常。
    • 贴心还是造成麻烦
      • Java是唯一采用受检异常的语言,这有两个目的:一、文件化,受检异常声明会是API操作接口的一部分,客户端只需要查阅文件就可以知道方法可能引发哪些异常,并事先加以处理;二、提供编译程序信息,让编译程序能够在编译时期就检查出API客户端没有处理的异常。
      • 自定义异常类别时,可以继承Throwable、Error、Exception的相关子类,通常建议继承自Exception或其子类,如果不是继承自Error或RuntimeException,那么就会是受检异常。
    • 认识堆栈追踪
      • 查看堆栈追踪可以直接调用异常对象的printStackTrace(),调用后可以在控制台显示堆栈追踪。显示信息中最顶层是异常根源,以下是调用方法顺序。
      • 若想取得个别的堆栈追踪元素进行处理,则使用getStackTrace(),这会返回StackTraceElement数组,数组中索引0为异常根源的相关信息,之后为各方法调用中的信息。
      • 在捕捉异常后什么都不做或是对异常做了不适当的处理,这样的程序代码会对应用程序维护造成严重伤害。
      • 若想要让异常堆栈起点为重抛异常的地方,使用fillInStackTrace()方法。
    • 关于assert
      • 程序执行的某个时间点或某个情况下,必然处于或不处于何种状态,这是一种断言。
  • 异常与资源管理
    • 使用finally
      • try、catch语法可以搭配finally,无论try区块中有无发生异常,若撰写有finally区块,则finally区块一定会被执行。
      • 如果程序撰写的流程中先return了,而且也有finally区块,那finally区块会先执行完后,再将值返回。
    • 自动尝试关闭资源
      • 想要尝试关闭资源的对象,是撰写在try之后的括号中,如果无需catch处理任何异常,可以不用撰写,也不用撰写finally自行尝试关闭资源。
      • 若一个异常被catch后的处理过程引发另一个异常,通常会抛出第一个异常作为响应,addSuppressed()方法是JDK7在java.lang.Throwable中新增的方法,可将第二个异常记录在第一个异常中。
      • 使用自动尝试关闭资源语法时,并不影响对特定异常的处理。
    • java.lang.AutoCloseable接口
      • JDK7的尝试关闭资源语法可套用的对象,必须操作java.lang.AutoCloseable接口。
      • AutoCloseable定义了close()方法。
      • 只要操作AutoCloseable接口,就可以套用至尝试关闭资源语法。
  • 使用Collection收集对象
    • 认识Collection架构
      • 收集对象的共同行为定义在Collection中。既然可以收集对象,也要能逐一取得对象,这就是java.lang.Iterable定义行为,它定义了iterator()方法返回java.util.Iterator操作对象,可以逐一取得对象。
    • 具有索引的List
      • List是一种Collection ,作用是收集对象,并以索引方式保留收集的对象顺序,其操作类之一是java.util.ArrayList。
      • List定义了许多索引操作的方法。
      • ArrayList特性: 有个可指定容量的构造函数,在大致知道将收集的对象范围,可事先建立足够长度的内部数组。
      • LinkedList特性: LinkedList在操作List接口时,采用了链接结构。若收集对象经常会有变动索引的情况,考虑链接方式操作的List比较好,像是随时会有客户登录或注销的客户端List,使用LinkedList会有比较的好的效率。
    • 内容不重复的Set
      • 同样是收集对象,在收集过程中若有相同对象,则不再重复收集,此时可以使用Set接口的操作对象。
      • 判断对象是否重复时,都会调用hashCode()与equals()方法,建议两个方法同时使用。
    • 支持队列操作的Queue
      • 使用Queue接口的操作对象可以使收集对象以队列方式,收集的对象加入至尾端,取得对象时从前段。
      • Queue定义了自己的offer()、poll()与peek()等方法。
      • add()、remove()、element()等方法操作失败时会抛出异常,而offer()、poll()与peek()等方法操作失败时会返回特定值。
      • 如果对象操作有Queue,并打算以队列方式使用,且队列长度受限,通常建议使用offer()、poll()与peek()等方法。
      • offer()用于在队列后端加入对象,成功返回true,失败返回false。
      • poll()用于取出队列前段对象,若队列为空则返回null。
      • peek()用于取得(但不取出)队列前段对象,若队列为空则返回null。
    • 使用泛型
      • 在设计API时可以指定类或方法支持泛型,使用API的客户端在语法上会更为简洁,并得到编译时期检查。
      • 使用定义类型,在需要编译程序检查类型的地方,都可以使用E像是add()方法必须检查传入的对象类型是E,get()方法必须转换为E类型。
      • 声明与建立对象时,可使用角括号告知编译程序,这个对象收集的都会是String,而取回之后也会是String,不用再使用括号转换类型。
      • 泛类型可以定义在方法上,最常见的是在静态方法上定义泛型。
    • 简介Lambda表达式
      • Lambda表达式的语法省略了接口类型与方法名称,->左边是参数列,右边是方法本体,编译程序可以由Request request 的声明中得知语法上被省略的信息。
      • 使用Lambda表达式,编译程序在推断类型时,还可以用泛型声明的类型作为信息的来源。
      • 重复的信息多了,改用Lambda语法来实现,加上编译程序的类型推断能力辅助。
      • 如果流程复杂,无法在一行的Lambda表达式中写完时,可以使用区块符号{}包括演算流程。在使用区块时,如果方法必须返回值,在区块中就必须使用return。
    • Interable与Iterator
      • iterator()方法定义在Collection接口中,List、Set、Queue继承自Collection,所以都拥有iterator()的行为。
      • iterator()方法会返回java.util.Iterator接口的操作对象,这个对象包括了Collection收集的所有对象,可以使用Iterator的hasNext()看有无下一个对象,有的话,再使用next()取得下一个对象。
    • Comparable与Comarater
      • 操作Comparable
        • Collections的sort()方法在取得a对象与b对象进行比较时,会先将a对象扮演为Comparable(也因此若对象没有操作Comparable,将会抛出ClassCastException),然后调用a.compareTo(b),如果a对象顺序上小于b对象则返回小于0的值,若顺序上相等则返回0,若顺序上a大于b则返回大于0的值。
      • 操作Comarater
        • Comarater的compare()会传入两个对象,如果o1顺序上小于O2则返回小于0的值,相等则返回0,否则返回大于0的值。
        • 在Java的规范中,与顺序有关的行为,通常要不对象本身是Comarable,要不就是另行指定Comarator对象告知如何排序。
        • set的操作类之一java.util.TreeSet,不仅拥有收集不重复对象的能力,还可以用红黑树方式排序收集的对象,条件是收集的对象必须是Comarable(否则会抛出ClassCastException),或者是在创建TreeSet时指定Comparator对象。
        • Queue的操作类之一java.util.PriorityQueue也是,收集至PriorityQueue的对象,会根据你指定的优先权来决定对象在队列中的顺序,优先权的告知,要不就是对象必须是Comparable,或者是创建PriorityQueue时指定Comparator对象。
        • reverseOrder()返回的Comparator会是Comparable对象上定义顺序的反序。
  • 键值对应的Map
    • 常用Map操作类
      • 常用的Map操作类为java.util.HashMap与java.util.TreeMap,其继承自抽象类java.util.AbstractMap。
      • 使用HashMap:在HashMap中建立键值对应之后,键是无序的。
      • 使用TreeMap:如果使用TreeMap建立键值对应,则键的部分将会排序,条件是作为键的对象必须操作Comparable接口,或者是创建TreeMap时指定操作Comparator接口的对象。
      • 使用Properties:Properties类继承自HashTable,HashTable操作了Map接口,Properties自然也有Map行为。Properties的=左边设定属性名称,右边设定属性值。可以使用Properties的load()方法指定InputStream实例。load()方法结束后会自动关闭InputStream实例。
    • 访问Map键值
      • 若想取得Map中所有的键,可以调用Map的keySet()返回Set对象。
      • 若想同时取得Map的键与值,可以使用entrySet()方法,这会返回一个Set对象,每个元素都是Map.Entry实例,可以调用getKey()取得键,调用getValue()取得值。
      • Map没有继承Iterable,有个forEach()方法是定义在Map接口上,可使用这个方法结合Lambda表达式,在迭代键与值时获得不错的可读性。

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

对本章学习内容没有太大问题。

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

书上代码还在学习目前没有问题,总体把书上的知识点看了一遍。

代码上传。http://git.oschina.net/l_cat_1/codes

其他(感悟、思考等,可选)

在这次学习中我认为可以采用先过一遍知识点和代码,再去实践编写程序这样书上的内容就可以过两遍加深印象,也可以明确重点程序并重点学习,为课后习题打基础。

学习进度条

| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长| | -------- | ----------------|----------------|--------------- |-----| | 目标 | 3000行 | 15篇 | 300小时 | | | 第一周 | 50/50 | 2/2 | 14/14 | | 第二周 | 100/150 | 1/3 | 10/24 | | 第三周 | 300/450 | 1/4 | 15/39 | | 第四周 | 350/800 | 1/5 | 50/74 | | 第五周 | 200/1000 | 1/6 | 30/104 |

 

原文地址:https://www.cnblogs.com/l-cat/p/5343665.html