您的位置:首页 > 编程语言 > Java开发

201453408刘昊阳 《Java程序设计》第5周学习总结

2016-04-03 08:34 399 查看

201453408刘昊阳 《Java程序设计》第5周学习总结

教材学习内容总结

第8章 异常处理

8.1 语法与继承结构

8.1.1 使用
try
catch


p227代码(Average)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/Average?dir=0&filepath=Average&oid=81ad0a5f5403ce540407071cc94fe2efc9402832&sha=6e96a227632c67d259a5c1073859bc3df6c5e9c2

InputMismatchException
错误信息表示不符合
scanner
预期对象

所有错误都会被打包成对象,可以尝试
try
捕捉
catch
代表错误的对象后做一些处理

p228代码(Average2)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/TryCatch%20Average2?oid=b7ae12a15194fe57cc717cfbda4f6c1bbd0af10e

虚拟机尝试执行
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)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/CollectionGuest?oid=522d52e5efbf8018678417cf85863b8b0f72f4e2

ArrayList
特征

使用数组特性

LinkedList
特性

采用链接结构

9.1.3 内容不重复的
Set


Set
接口:在收集过程中若有相同的对象,则不再重复收集,可以使用
Set
接口的操作对象

p26代码(WordCount)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/WordCount?oid=beaad7c049f9ddca8c24a656ab112bac71b72169

p269代码(Students)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/Student?oid=5616d493b86aab13c95b0abe7492114bd909bf13

哈希桶:在内存中开设空间,每个空间里都有哈希函数,对象要加入
HashSet
,则会调用对象的
hashCode()
取得哈希码并尝试放入对应号码的哈希桶中,调用
equals
判断两个对象是否相同是否予以收集

p270代码(Students2)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/Student2?oid=5192f51c5079580a532ed3a2c2b0b9aaf0c733a3

9.1.4 支持队列操作的
Queue


Queue
接口:收集对象时以队列方式,收集的对象加至尾端,取得对象从前端,可以使用
Queue
接口的操作对象,继承自
Collection


Queue
定义了自己的
offer()
poll()
peek()
方法,操作失败会返回特定值

offer()
在队列后端加上对象,成功返回
true
,失败返回
false


poll()
取出队列前端对象,,队列为空返回
null


peek()
取得但不取出队列前端对象,队列为空返回
null


p272代码(RequestQueue)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/RequestQueue?oid=4b8a53007d44a88a6a085ee0be415d78f70ff64dc5

deque
Queue
的子接口,定义了对队列的前端和尾段进行操作

java.util.Arraydeque
操作了
Deque
接口

使用
ArrayDeque
操作容量有限的堆栈

9.1.5 使用泛型

p275代码(ArrayList)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/CollectionArrayList?oid=f54bde5fd8e8361c004dd71458646337917ed6ab

类名称旁边
<E>
,表示支持泛型(客户端声明的E类型)

不指定
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)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/ForEach?oid=8af1477d527a319cb9247fccd8abdb920071750b

9.1.8
Comparable
Comparator


p284代码(Sort)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/Sort?oid=4909b678872e522e3f638cc0f3ae59b6e3a16508

p285代码(Sort2)

http://git.oschina.net/yg1022/java-besti-is-2015-2016-2-20145308/blob/master/Sort2?oid=91f2f7bf8afe484ae74f1710242e788def373730

操作
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/301/216/16基本知识
第二周100/1301/318/38基本语法
第三周100/2301/422/60对象封装
第四周300/5301/530/90继承接口
第五周300/8301/630/120异常与Collection、Map
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: