教材学习内容总结

第8章 异常处理

1.使用try...catch

  • 与C语言中程序流程和错误处理混在一起不同,Java中把正常流程放try块中,错误(异常)处理放catch块中。
  • 如果父类异常对象在子类异常前被捕捉,则catch子类异常对象的区块将永远不会被执行。
  • catch括号中列出的异常不得有继承关系,否则会发生编译错误。
  • 在catch区块进行完部分错误处理之后,可以使用throw将异常再抛出。

2.异常继承架构

  • Error对象抛出时,基本不用处理,最多留下日志信息;
  • 程序设计本身的错误,使用 Exception或其子类实例来实现,所以错误处理通常称为异常处理。
  • Java异常处理是要处理Exception类及其子类(Checked Exception)
  • RuntimeException及其子类也不用处理(Unchecked Exception)。
  • 产生RuntimeException的问题在调用代码。

    但就语法与继承架构上来说,如果某个方法声明会抛出Throwable或子类实例,只要不属于Errorjava.lang.RuntimeException或其子类异常,在设计程序是要明确使用try、catch语法加以处理,或用throws声明这个方法会抛出异常,否则就会编译失败。

3.catch 和 throw

书上通过生动的例子总结了catch和throw的区别。总的来说,catch捕捉的异常由当前环境信息进行处理,而throw抛出的异常由调用方法的客户端进行处理。后者在编译上更为灵活。

4.堆栈追踪

  • 要得知异常发生的根源,以及多重方法调用下异常的堆栈传播,会自动收集异常对象。
  • 一般来说,最上层是产生异常的根本原因,找代码问题可以从最下层开始找。
  • 要善用堆栈追踪,程序不要有私吞异常的行为,也不要对异常做不恰当的处理。
  • 使用throw重抛异常的时候,异常的追踪堆栈起点在异常发生的根源,而不是抛出的地方。

5.assert断言

  • 断言指的是程序执行的某个时间点或某个情况下,必然处于或不处于某种状态。
  • 断言的结果一定是成立或不成立。
  • 运行java程序时,默认不启动断言检查;若要启动断言检查,要使用java -ea。
  • 何时该使用断言:
  1. 断言客户端调用方法之前,已经准备要某些前置条件(通常在private方法之中)
  2. 断言客户端调用方法后,具有方法承诺的结果
  3. 断言对象某个时间点下的状态
  4. 使用断言取代批注
  5. 断言程序流程中绝对不会执行到的程序代码部分。

6.finally

  • 如果想一定要执行关闭资源的动作,try、catch语法可以搭配finally使用,这样,无论是否有异常,finally区块一定会被执行。
  • 如果撰写的流程中有return也有finally区块,那么finally区块会先执行再将值返回。

7.关闭资源

  • try with resources关闭多个资源时用分号分隔。
  • try with resources的对象必须实现AutoCloseable接口。

第九章 Collection与Map

1.Collection架构

  • 可以收集对象,也能逐一取得对象,这是java.lang.Iterable定义的行为。
  • List是一种Collection,作用是收集对象,并以索引方式保留收集的对象顺序。

2.ArrayList和LinkedList

  • ArrayList使用的是数组的特性,数组在内存中回事连续的线性空间,就相当于是数据结构中学到的线性表;
  • LinkedList在操作List接口时,采用了链接结构,就相当于是数据结构中的链表,想要指定索引随机存取对象时,链接方式都得使用从第一个元素开始查找下一个元素的方式。
  • 若收集的对象经常有变动索引的情况,用LinkedList比较好。

3.Queue

  • Queue定义了自己的offer()、poll()与peek()等方法,操作失败时会返回特定的值。
  • Deque(双向队列)时Queue的子接口,它与Queue有几个操作是等义的。
  • 可以用ArrayQueue实现堆栈。

4.泛型

  • 用角括号告知编译程序对象收集的类型。
  • Java的CollectionAPI都支持泛型语法。

5.Lambda表达式

  • 遵循"DRY"(Don't Repeat Yourself)原则,省略了接口类型与方法名称,简化编程过程。
  • 如果是单参数又无须写出参数类型的时候,()也可以省略。
  • 在Lambda表达式中使用区块是,如果方法必须返回值,在区块中必须使用return。

6.Interable与Iterator

  • JDK5出现前,Iterator()方法是定义在Collection接口中的;JKD5出现后,Iterator()方法提升在新的java.util.Iterable父接口,可以使用foreach()方法显示收集的所有对象。
  • List是一种Iterable,可以使用forEach()方法。
  • 任何操作Iterable的对象,都可以使用这个forEach()方法,而不一定要是Collection。

7.Comparable与Comparator

  • Collections的sort()方法要求被排序的对象,必须操作java.lang.Comparable接口,这个接口有个compareTo()方法必须返回大于0、等于0或小于0的数。
  • Collections的sort()方法有另一个重载版本,可接受java.lang.Comparator接口的操作对象,排序方式将根据Comparator的compare()定义来决定。
  • sort:Java中对象排序,要么对象实现了Comparable可以直接sort,要么提供Comparator对象告知sort如何排序。也就是说,若对象本身就是Comparable,即可比较的,就可以直接排序;若不是,就另行指定Comparator对象告诉程序依照某种规律进行排序。

8.Map

  • Dictionary与HashTable不建议使用

(1)HashMap

  • put:建立键值对应,第一个自变量,第二个自变量是值
  • get:指定键取回对应的值。

(2)TreeMap

使用TreeMap建立键值对应,键的部分将会排序,条件是作为键的对象必须操作Comparable接口,或者创建TreeMap时指定操作Comparator接口的对象。

(3)Properties

  • setProperty():指定字符串类型的键值;
  • getProperty():指定字符串类型的键;
  • load():指定InputStream的实例。

(4)访问Map键值

  • keySet():返回set对象
  • values():取得Map中所有的值
  • entrySet():同时取得Map的键与值
  • getKey():取得键
  • getValue():取得值

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

  • 问题1: API文档中带throws的必须使用try...catch
  • 解决1: 查看API文件,read()方法声明中会抛出IOExceptionIOExceptionException的直接子类,但不属于RuntimeException或其子类,这是受检异常,在设计程序是要明确使用try、catch语法加以处理,或用throws声明这个方法会抛出异常,否则就会编译失败。
  • 问题2: 用throws和用throw有什么区别?
  • 解决2:
  • throws:无法自行处理,用于声明方法会抛出异常
  • throw:方法中抛出Checked Exception,方法声明中必须有throws

用户程序自定义的异常和应用程序特定的异常,必须借助于throws和throw语句来定义抛出异常。

  • throw是语句抛出一个异常,语法:throw(异常对象);throw e;
  • throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)语法:(修饰符)(方法名)([参数列表])[throws(异常类)]{......}
public void doA(int a) throws Exception1,Exception3{......}
  • 问题3: 什么是多重捕捉,要注意什么问题?

  • 解决3: 一开始看书时,觉得多重捕捉就是讲多个异常合在一起捕捉,遵循"DRY"(Don't Repeat Yourself)原则,使程序更简洁。但是多重捕捉时出现问题,发现是没有注意异常继承架构。在多重捕捉的时候,catch括号中列出的异常不得有继承关系,否则会发生编译错误。

  • 问题4:printStackTracefillInStackTrace的区别

  • 解决4: 使用

    printStackTrace()方法时,异常的追踪堆栈起点在异常发生的根源,而不是抛出的地方;使用fillInStackTrace()方法时,堆栈追踪从重抛处开始追踪。

  • 问题5: 如何区分继承与泛型

  • 解决5: 泛型无法提供像继承中的动态绑定功能。

  • 泛型主要是针对程序设计时的函数而言,继承主要是面向对象时更便于操作和修改。

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

  • 编译p269的Students.java时遇到如下问题



    解决:查看代码发现,最后输出的应该是student而不是set。
  • 修改代码后再次编译后发现



    解决:原因是jdk1.5里的集合类的创建和jdk1.4里有些区别,主要是jdk1.5里增加了泛型,也就是说可以对集合里的数据进行检查。通过后面对泛型的学习,再次修改了代码。
  • 第三次编译发现



    查找资料后,还未得到解决。之后学习中有想法了或者能力足够解决再更新解决情况。

代码托管

  • 用statistics脚本查看代码行数

  • 代码提交结果

上周考试错题总结

  • 4.填空:”Hello”.charAt(1) 的值是(++‘e’++)

    理解情况:charAt()方法返回指定索引位置的char值。索引范围为0~length()-1.本道题中索引的为"1",也就是第二位"e"。

  • 5.填空:System.out.println( “HELLO”.( ++toLowerCase()++ ) ) 会输出“hello”.

    理解情况:toLowerCase的意思是将所有的英文字符转换为小写字母;toUpperCase的意思是将所有的英文字符转换为大写字母。本题中,要求将所有的大写字母转换为小写字母输出

  • 6.填空:”Hello”.substring(++0,2++ )的值是“He”

    理解情况:substring() 方法用于提取字符串中介于两个指定下标之间的字符。本题要求输出"He",则两个指定下标应是0,2

  • 23.CH06填空:实现一个类中的equals()方法时,一定要同时实现(++hashCode()++)方法

    理解情况:虽然书上说要之后才会学到,但我查找资料发现同时实现两种方法是为了保证对象的唯一性。

  • 30.CH07 填空:面向对象中,设计经验可以用(++设计模式++)表达

    理解情况:知道了设计经验可以用设计模式来表达,其实就是一种模板,供交流学习。

结对及互评

评分标准(满分10分)

  1. 从0分加到10分为止

  2. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  3. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  4. 教材学习中的问题和解决过程, 一个问题加1分

  5. 代码调试中的问题和解决过程, 一个问题加1分

  6. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  7. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
  8. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分

点评模板:

  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

收获

本周老师让我们开始结对学习,这在一定程度上方便了同学之间的互相学习和促进。这周虽然博客写完了,但对章节内容只能说是一知半解,有时候遇到的问题还不足以解决。在之后的学习中,我还会多看看以前写过的代码,希望随着知识的积累能让我解决以前没解决的问题。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 20/20 1/1 10/10 安装了JDK、IDEA和Git,写了第一个Java程序
第二周 97/117 2/3 20/30 用Linux上传代码,熟悉修改文件的命令行
第三周 336/453 2/4 35/65 在Linux上安装JDK和IDEA,更熟悉vi的操作指令以及修改时需要注意的地方。
第四周 851/1304 1/5 25/90 学习用JDB调试程序
第五周 834/2138 1/7 32/122 能自己设计简单的程序,遇到问题也基本上能通过前面的学习和查资料解决,还有问题没有得到解决。
  • 计划学习时间:35小时
  • 实际学习时间:32小时

参考资料

20155315 2016-2017-2 《Java程序设计》第五周学习总结的更多相关文章

  1. 201521123025<java程序设计>第五周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...

  2. Java程序设计第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 **代码阅读:Child压缩包内源代码 Child.java源代 ...

  3. 20155336 2016-2017-2《JAVA程序设计》第九周学习总结

    20155336 2016-2017-2<JAVA程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC(Java DataBase Connectivity)即java数据库连接 ...

  4. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

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

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  6. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  7. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  8. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

  9. 20145237 《Java程序设计》第九周学习总结

    20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...

  10. 20175209 《Java程序设计》第九周学习总结

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

随机推荐

  1. python基础(四)文件操作和集合

    一.文件操作 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 1.文件基本操作: f = open('file.txt','r') # ...

  2. Android事件分派机制

    最近一直在学习Android里面的事件分派机制,感觉很奇妙,看了很多博客和分析,才在脑子里形成了一个模糊的概念,对事件分派有了一定的认识. 于是,我画了一个图来简单明了的表述Android中事件的分派 ...

  3. Thread start()方法和run()方法的区别

    转自:http://www.cnblogs.com/skywang12345/p/3479083.html start():作用一个新的线程,新线程会执行相应的run()方法,start()不能被重复 ...

  4. Java多线程(三) —— 线程并发库之总体架构

    对java并发库一直觉得很神秘,决定好好研究一下. 参考文献: https://blog.csdn.net/hp910315/article/details/50963095 http://www.b ...

  5. ASP.NET MVC 模型绑定

    模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C#间起着桥梁的作用.模型绑定的一个最简单的例子是带参数的控制器action方法,比如我们注册这样的路径映射: ...

  6. Qt——基本工具的使用

    本文主要介绍在windows系统中使用C++编写Qt程序所需要的一些工具,不会具体地讲工具怎么使用. 其它系统的安装本文不会涉及,在http://wiki.qt.io/Main中,有关于各种系统qt安 ...

  7. Stone Game, Why are you always there? HDU - 2999(sg定理)

    题意:给你n个数的集合,表示你每次取石子只能为集合里的数,然后给你一排石子,编号为1~n,每次你可以取相邻位置的连续石子(数量只能为集合里的数),注意石子的位置时不变的,比如把2拿走了,1和3还是不相 ...

  8. 【JQuery】JQuery属性

    一.前言         接着上一章的内容,继续本章的学习. 二.内容 $().jquery 返回的字符串包含jquery的版本号 jQuery.fx.interval 改变以毫秒计的动画运行速率 j ...

  9. CF662C Binary Table 【状压 + FWT】

    题目链接 CF662C 题解 行比较少,容易想到将每一列的状态压缩 在行操作固定的情况下,容易发现每一列的操作就是翻转\(0\)和\(1\),要取最小方案,方案唯一 所以我们只需求出每一种操作的答案 ...

  10. Codeforces Round #290 (Div. 2) 拓扑排序

    C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...