201453408刘昊阳 《Java程序设计》第5周学习总结
201453408刘昊阳 《Java程序设计》第5周学习总结
教材学习内容总结
第8章 异常处理
8.1 语法与继承结构
8.1.1 使用try
、catch
- p227代码(Average)
- 所有错误都会被打包成对象,可以尝试
try
捕捉catch
代表错误的对象后做一些处理 - p228代码(Average2)
- 虚拟机尝试执行
try
区块中的程序代码,如果发生错误,执行流程会跳离错误发生点,然后比较catch
括号中声明的类型,是否符合被抛出的错误对象类型,如果是的话,就执行catch
区块的程序代码 - p229代码(Average3)
- http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/TryCatchAverage3?oid=ba0ff5c192e00ed62a8e86efab81c98977be3dea
- 输入错误后,通过
console.next()
取得错误的字符输出后并输出平均值
8.1.2 异常继承架构
- 错误会被包装成对象,这些对象都是可抛出的(
throw
),因此设计错误对象都继承至java.lang.Throwable
类,Throwable
定义了取得错误信息、堆栈追踪等方法,他有两个子类java.long.Error
、java.lang.Exception
Error
与其子类实例代表严重系统错误(硬件层面错误,JVM错误或者内存不足),不建议用try
、catch
来处理Error
对象,Java应用程序本身无力回复Exception
或其子类实例可以表现程序设计本身的错误,称错误处理为“异常处理”
- 如果某个方法声明会抛出
Throwable
或其子类实例。只要是不属于java.lang.RuntimeException
、Error
及其子类实例,就必须使用try
、catch
语法,或throws
声明 - 受检异常:
Exception
或其子对象,但不属于RuntimeException
或其子对象 - 非受检异常(执行时期异常):
RuntimeException
衍生的类实例,应该在调用方法前做好检查,编译程序不会强迫一定在语法上进行修改 - p233代码(Average4)
- http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/TryCatchAverage4?oid=72a40b5715d6edf4ad1fdda30e52bfb7c2e970df
- 取得用户输入的字符串后,检查其是否为数字格式,是转换为
int
型,不是提醒用户重新输入
- 使用
try
、catch
捕捉异常对象时,如果父类异常对象在子类异常对象前被捕捉,catch
子类异常对象的区块将永远不被执行,编译程序会检查出错误,完成编译必须更改异常对象捕捉顺序 - 多重捕捉:
cath( | | )
会在发生多种异常时执行,但括号中列出的异常不得有继承关系
8.1.3 要抓还是要抛
FileInputStream
可指定档名来开启与读取文档内容,是InputStreaam
的子类,可用作创建Scanner
- 方法设计流程中发生异常,设计时没有充足信息知道如何处理,可以抛出异常让客户端处理
throws
:由方法的客户端依据当时的调用环境信息进行处理受检异常,用throws
声明此方法会抛出的异常类型或父类型- p236代码(FileUtil)
- http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/FileUtil?oid=fa03dff7b2edc52b48ef41a4027f2138b615d670
- 先处理部分事项再抛出(在
throws
里用try
、catch
再在任何流程中使用throw
将异常再抛出)- 在流程中抛出异常就直接跳离原有的流程
- 抛出受检异常,认为客户端能处理异常,必须在方法上使用
throws
声明 - 抛出非受检异常,认为客户端调用方法时机出错,抛出异常要求客户端修改漏洞再来调用方法
- 托管地址
- 使用继承,父类的某个方法声明
throws
某些异常,子类重新定义该方法时可以- 不声明
throws
任何异常 throws
父类该方法中声明的某些异常throws
父类该方法中声明异常的子类
- 不声明
- 不可以
throws
父类方法中未声明的其他异常throws
父类方法中声明异常的父类
8.1.4 贴心还是造成麻烦
- 可以考虑为应用程序自定义专属异常类别,可以继承
Throwable
、Error
或Exception
的相关子类,通常建议继承自Exception
或其子类,如果不是继承自Error
或RuntimeException
,那么就会是受检异常 - 开发者需要思考,一场是客户端可以处理的异常,还是客户端没有准备好前置条件就调用方法引发的异常
8.1.5 认识堆栈追踪
- 堆栈追踪:想得知异常发生的根源,以及多重方法调用下异常的堆栈传播,可以利用异常对象自动收集的堆栈追踪
- 堆栈追踪最简单的方式是直接调用异常对象的
printStackTrace()
- p240代码(StackTraceDemo)
- http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/StackTraceDemo?oid=43c40bfa44b74a9c08bf05b44d72fbeadca61478
- 异常发生被捕捉后,调用
printStackTrace()
在控制台显示堆栈追踪
- 堆栈追踪信息中显示了异常信息,最顶层是异常的根源,以下是调用方法的顺序
- 使用
javac
编译时指定-g:none
自变量就不会记录出错信息 getStackTrace()
:取得个别的堆栈追踪元素进行处理,返回StackTraceElement
数组- 善用堆栈追踪,程序代码中不可以有私吞异常的行为,捕捉异常后什么都不做或者对异常做了不适当的处理或者显示了不正确的信息
- 使用
throw
重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,不是重抛异常的地方 - p242代码(StackTraceDemo2)
- http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/StackTraceDemo?oid=43c40bfa44b74a9c08bf05b44d72fbeadca61478
fillStackTrack()
方法:让异常堆栈起点为重抛异常的地方,会重新装填异常堆栈,将起点设为重抛异常的地方,返回Throwable
对象
8.1.6 关于assert
assert
- 程序执行的某种情况下,必然处于或不处于何种状态下
- 使用语法
assert boolean_expression
:boolean_expression
为true
,什么事都不会发生,为false
,会发生java.lang.AssertionError
assert boolean_expression : detail_expression
:将detail_expression
的结果显示出来,对象调用toString()
显示文字描述结果
- 启动断言检查,执行
java
指令时,指定-enableassertions
或-ea
自变量 - 使用断言
- 调用方法前,已经准备好某些前置条件
- 调用方法前,具有方法承诺的结果
- 断言对象某个时间点下的状态
- 使用断言取代批注
- 断言程序流程中绝对不会执行到的程序代码部分
8.2 异常与资源管理
8.2.1 使用finally
finally
:可以搭配try
、catch
语法使用,无论try
区块中有无发生异常,finally
区块一定会被执行- p248代码(FinallyDemo)
- 地址
- 程序先
return
,而且也有finally
区块,会先执行finally
区块,再将值返回
8.2.2 自动尝试关闭资源
- 尝试关闭资源语法
- 想要尝试自动关闭资源的的对象,是撰写在
try
之后的括号中,如果无须catch
处理任何异常,可以不用撰写,也不用撰写finally
自行尝试关闭资源
- 想要尝试自动关闭资源的的对象,是撰写在
8.2.3 java.lang.AutoCloseable接口
- 尝试关闭资源语法可套用对象,必须操作
java.lang.AutoCloseable
接口 - p253代码(AutoClosableDemo)
- 地址
- 只要操作
AutoCloseable
接口,就可以套用至尝试关闭资源语法,可以同时关闭两个以上的资源对象,中间以分号分隔 - p253代码(AutoClosableDemo2)
- 地址
try
括号中越后面撰写的对象会越早被关闭
第9章 Collection
与Map
9.1 使用Collection
收集对象
9.1.1 认识Collection
架构
- 收集对象的共同行为定义在
Collection
中
9.1.2 具有索引的List
List
是一种Collection
,其作用类之一是java.util.arrayList
- p264代码(Guest)
ArrayList
特征- 使用数组特性
LinkedList
特性- 采用链接结构
9.1.3 内容不重复的Set
Set
接口:在收集过程中若有相同的对象,则不再重复收集,可以使用Set
接口的操作对象- p26代码(WordCount)
- p269代码(Students)
- 哈希桶:在内存中开设空间,每个空间里都有哈希函数,对象要加入
HashSet
,则会调用对象的hashCode()
取得哈希码并尝试放入对应号码的哈希桶中,调用equals
判断两个对象是否相同是否予以收集 - p270代码(Students2)
9.1.4 支持队列操作的Queue
Queue
接口:收集对象时以队列方式,收集的对象加至尾端,取得对象从前端,可以使用Queue
接口的操作对象,继承自Collection
Queue
定义了自己的offer()
、poll()
、peek()
方法,操作失败会返回特定值offer()
在队列后端加上对象,成功返回true
,失败返回false
poll()
取出队列前端对象,,队列为空返回null
peek()
取得但不取出队列前端对象,队列为空返回null
- p272代码(RequestQueue)
deque
:Queue
的子接口,定义了对队列的前端和尾段进行操作java.util.Arraydeque
操作了Deque
接口- 使用
ArrayDeque
操作容量有限的堆栈
9.1.5 使用泛型
- p275代码(ArrayList)
- 不指定
T
的实际类型,那么T
出现的位置就回归为使用Object
- 声明参考时有指定类型,创建对象时就不用再写类型了
9.1.6 简介Lambda
表达式
Lambda
表达式:Request request = ()-> out.ptinf("处理数据%f%n",Math.random() )
- 相对于匿名类语法,省略了接口方法和方法名称,
->
左边是参数列,右边是方法本体 - p280代码(RequestQueue2)
- http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/RequestRequest2?oid=00fac829a2b57ca61ddd2c295d73b76613902bc5
- 可以用{}包括演算流程,若果方法必须返回值,在区块中就必须使用
return
9.1.7 Interable
与Iterator
iterator()
方法:返回java.util.Iterator
接口的操作对象,包括了Collection
收集的所有对象,利用iterator()
的hasNext()
看看有无下一对象,用iterator()
的next
取得下一对象- p283代码(ForEach)
9.1.8 Comparable
与Comparator
- p284代码(Sort)
- p285代码(Sort2)
- 操作
Comparable
Collections
的Sort()
方法在取得a对象与b对象进行比较时,会先将a对象扮演为Comparale
,然后调用a.compareTo(b)
,a对象顺序小于b对象返回小于0的值,相等返回0,大于返回大于0的值
- 操作
Comparator
java.util.Arrays
的Sort()
方法,针对对象排序有两种版本:收集在数组中的数据必须是Comparable
,或者可以传入Comparator
指定排序方式
reverseOder()
返回的Comparator
会是Comparable
对象上定义顺序的反序,nullsFirst()
接受Comparator
在其定义顺序上加上让null
排在最前面的规则
9.2 键值对应的Map
- 事先利用
java.util.Map
接口的操作对象来建立键值对应的数据
9.2.1 常用Map
操作类
- 使用
HashMap
- 建立键值,使用
put()
方法,指定键取回对应的值,使用get()
方法
- 建立键值,使用
- 使用
TreeMap
- 让键有序,键的部分会排序
- 作为键的对象必须操作
Comparable
接口,或者在创建TreeeMap
时指定操作Comparator
接口的对象
- 使用
Properties
Properties
有Map
接口和Hashtable
父类的行为setProperty()
指定字符串类型的键值,getProperty()
指定字符串类型的键,取回字符串类型的值
- 使用
System
的static
方法getProperties()
取得properties
实例
9.2.2 访问Map
键值
KeySet()
:取得Map
所有的键,调用Map
的KeySet()
返回Set
对象Values()
:取得map
中所有的值,可以使用values()
返回Collection
对象entrySet()
:同时取得Map
的键与值,返回一个Set
对象,每个元素都是Map.Entry
实例,可以调用getkey()
取得键,调用getValue()
取得值
教材学习中的问题和解决过程
- 问题:各种异常间的关系
- 解决过程:
Error
(严重系统错误) 受检异常(客户端有能力处理):Exception
非受检异常(未在恰当时机调用方法):RuntimeException
代码调试中的问题和解决过程
-
问题:p264代码(Guest),代码运行时输入小写英文字母,会自动转换成大写字母
-
解决过程:猜想应该与作用类的定义有关,具体因为什么还没搞清楚
其他(感悟、思考等,可选)
本周学习时间比较紧,感觉到Java学到现在,基本语法现在已经逐步讲完,开始侧重于不同的常用API和其他需要掌握的地方,学会利用可下载的代码调试,可以加快学习效率
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 30/30 | 1/2 | 16/16 | 基本知识 |
第二周 | 100/130 | 1/3 | 18/38 | 基本语法 |
第三周 | 100/230 | 1/4 | 22/60 | 对象封装 |
第四周 | 300/530 | 1/5 | 30/90 | 继承接口 |
第五周 | 300/830 | 1/6 | 30/120 | 异常与Collection、Map |