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

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

教材学习内容总结

第8章 异常处理

8.1 语法与继承结构

8.1.1 使用trycatch
8.1.2 异常继承架构
  • 错误会被包装成对象,这些对象都是可抛出的(throw),因此设计错误对象都继承至java.lang.Throwable类,Throwable定义了取得错误信息、堆栈追踪等方法,他有两个子类java.long.Errorjava.lang.Exception
    • Error与其子类实例代表严重系统错误(硬件层面错误,JVM错误或者内存不足),不建议用trycatch来处理Error对象,Java应用程序本身无力回复
    • Exception或其子类实例可以表现程序设计本身的错误,称错误处理为“异常处理”
  • 如果某个方法声明会抛出Throwable或其子类实例。只要是不属于java.lang.RuntimeExceptionError及其子类实例,就必须使用trycatch语法,或throws声明
  • 受检异常:Exception或其子对象,但不属于RuntimeException或其子对象
  • 非受检异常(执行时期异常):RuntimeException衍生的类实例,应该在调用方法前做好检查,编译程序不会强迫一定在语法上进行修改
  • p233代码(Average4)
  • 使用trycatch捕捉异常对象时,如果父类异常对象在子类异常对象前被捕捉,catch子类异常对象的区块将永远不被执行,编译程序会检查出错误,完成编译必须更改异常对象捕捉顺序
  • 多重捕捉:cath( | | )会在发生多种异常时执行,但括号中列出的异常不得有继承关系
8.1.3 要抓还是要抛
  • FileInputStream可指定档名来开启与读取文档内容,是InputStreaam的子类,可用作创建Scanner
  • 方法设计流程中发生异常,设计时没有充足信息知道如何处理,可以抛出异常让客户端处理
  • throws:由方法的客户端依据当时的调用环境信息进行处理受检异常,用throws声明此方法会抛出的异常类型或父类型
  • p236代码(FileUtil)
  • 使用继承,父类的某个方法声明throws某些异常,子类重新定义该方法时可以
    • 不声明throws任何异常
    • throws父类该方法中声明的某些异常
    • throws父类该方法中声明异常的子类
  • 不可以
    • throws父类方法中未声明的其他异常
    • throws父类方法中声明异常的父类
8.1.4 贴心还是造成麻烦
  • 可以考虑为应用程序自定义专属异常类别,可以继承ThrowableErrorException的相关子类,通常建议继承自Exception或其子类,如果不是继承自ErrorRuntimeException,那么就会是受检异常
  • 开发者需要思考,一场是客户端可以处理的异常,还是客户端没有准备好前置条件就调用方法引发的异常
8.1.5 认识堆栈追踪
  • 堆栈追踪:想得知异常发生的根源,以及多重方法调用下异常的堆栈传播,可以利用异常对象自动收集的堆栈追踪
  • 堆栈追踪最简单的方式是直接调用异常对象的printStackTrace()
  • p240代码(StackTraceDemo)
  • 堆栈追踪信息中显示了异常信息,最顶层是异常的根源,以下是调用方法的顺序
  • 使用javac编译时指定-g:none自变量就不会记录出错信息
  • getStackTrace():取得个别的堆栈追踪元素进行处理,返回StackTraceElement数组
  • 善用堆栈追踪,程序代码中不可以有私吞异常的行为,捕捉异常后什么都不做或者对异常做了不适当的处理或者显示了不正确的信息
  • 使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,不是重抛异常的地方
  • p242代码(StackTraceDemo2)
8.1.6 关于assert
  • assert
    • 程序执行的某种情况下,必然处于或不处于何种状态下
    • 使用语法
      • assert boolean_expressionboolean_expressiontrue,什么事都不会发生,为false,会发生java.lang.AssertionError
      • assert boolean_expression : detail_expression:将detail_expression的结果显示出来,对象调用toString()显示文字描述结果
  • 启动断言检查,执行java指令时,指定-enableassertions-ea自变量
  • 使用断言
    • 调用方法前,已经准备好某些前置条件
    • 调用方法前,具有方法承诺的结果
    • 断言对象某个时间点下的状态
    • 使用断言取代批注
    • 断言程序流程中绝对不会执行到的程序代码部分

8.2 异常与资源管理

8.2.1 使用finally
  • finally:可以搭配trycatch语法使用,无论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章 CollectionMap

9.1 使用Collection收集对象

9.1.1 认识Collection架构
  • 收集对象的共同行为定义在Collection
9.1.2 具有索引的List
9.1.3 内容不重复的Set
9.1.4 支持队列操作的Queue
  • Queue接口:收集对象时以队列方式,收集的对象加至尾端,取得对象从前端,可以使用Queue接口的操作对象,继承自Collection
  • Queue定义了自己的offer()poll()peek()方法,操作失败会返回特定值
    • offer()在队列后端加上对象,成功返回true,失败返回false
    • poll()取出队列前端对象,,队列为空返回null
    • peek()取得但不取出队列前端对象,队列为空返回null
  • p272代码(RequestQueue)
  • dequeQueue的子接口,定义了对队列的前端和尾段进行操作
  • java.util.Arraydeque操作了Deque接口
  • 使用ArrayDeque操作容量有限的堆栈
9.1.5 使用泛型
9.1.6 简介Lambda表达式
9.1.7 InterableIterator
9.1.8 ComparableComparator

9.2 键值对应的Map

  • 事先利用java.util.Map接口的操作对象来建立键值对应的数据
9.2.1 常用Map操作类
  • 使用HashMap
    • 建立键值,使用put()方法,指定键取回对应的值,使用get()方法
  • 使用TreeMap
    • 让键有序,键的部分会排序
    • 作为键的对象必须操作Comparable接口,或者在创建TreeeMap时指定操作Comparator接口的对象
  • 使用Properties
    • PropertiesMap接口和Hashtable父类的行为
    • setProperty()指定字符串类型的键值,getProperty()指定字符串类型的键,取回字符串类型的值
  • 使用Systemstatic方法getProperties()取得properties实例
9.2.2 访问Map键值
  • KeySet():取得Map所有的键,调用MapKeySet()返回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
posted @ 2016-04-03 08:34  20145308刘昊阳  阅读(167)  评论(2编辑  收藏  举报