20155232 2016-2017-3 《Java程序设计》第5周学习总结

20155232 2016-2017-3 《Java程序设计》第5周学习总结

教材学习内容总结

  • 第八章 异常处理

1.使用try和catch
将正常的流程放try块中,异常处理放catch块中。

2.错误会被包装为对象,这些对象都是可抛出的,因此设计错误对象都继承自java.lang.Throwable类,Throwable定义了取得错误信息,堆栈追踪等方法,他有两个子类:java.lang.Error与java.lang.Exception。

3.Error与其子类实例代表严重系统错误。(如硬件层面错误,JVM错误或内存不足等)Error对象抛出时,基本上不用处理,任其传播至JVM为止。

4.程序本身的错误,建议使用Exception或其子类实例表现,所以通常称为异常处理。

5.Exception或其子对象,但非属于RuntimeException或其子对象,称为受检异常。

6.属于RuntimeException衍生出来的类实例,称为非受检异常。

7.如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块将永远不会被执行。

8.可以使用多重捕捉的语法。
注意:catch括号中列出的异常不得有继承关系,否则编译错误。

9.throws:自己无法处理,用在方法声明。

10.throw:方法中抛出Checked Exception,方法声明中必须有throws。
若是非受检异常,则无需使用throws声明。

11.java是唯一采用受检异常的语言。有两个目的:一是文件化,二是提供编译程序信息。

12.自定义异常类别时,可以继承Throwable,Error或Exception的相关子类,通常建议继承自Exception或其子类,如果不是继承Error或RuntimeException,那么就会是受检异常。

13.查看堆栈追踪最简单的方法就是直接调用异常对象的

printStackTrace()

14.如果想要取得个别的堆栈追踪元素进行处理,则可以使用

getStackTrace()

注意要善用堆栈追踪,前提是程序代码中不可有私吞异常的行为。这样程序代码会对应用程序的维护造成伤害。甚至找不出错误根源。

15.在使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方。

16.使用

fillInStackTrace()

方法会重新装填异常堆栈,将起点设为重抛异常的地方,并返回Throwable对象。

17.断言

程序执行的某个时间点或某个情况下,必然处于或不处于何种状态。

18.如果要在执行时启动断言检查,可以在执行java指令时,指定-enableassertions 或-ea自变量。

19.合适使用断言(5点)书上p244

20.try,catch语法搭配finally,无论try区块中有无异常,则finally区块一定会被执行。
如果程序中先return了,而且也有finally区块,就会先执行区块再将值返回。

21.在JDK7后新增了尝试关闭(Try-With-Resource)语法,想要尝试关闭资源的对象,是撰写在try之后的括号中。

注意尝试关闭资源语法也可以同时关闭两个以上的对象资源,只要中间以分号分个,在try括号中,越后面撰写的对象资源,越会越早被关闭。

22.java异常体系结构:
image

  • 第九章

1.收集对象的行为,像是新增对象,移除对象的方法等,都是定义在java.util.collection中。

2.java.lang.Iterable定义了itrable()方法返回java.util.Iterable操作对象,可以逐一取得收集的对象。

3.由java.util.Set定义,是收集的对象不重复,具有集合的行为。

4.由java.util.list定义,收集时记录每个对象的索引顺序,可依照索引取回对象。

5.由java.util.Queue,使收集对象时以队列方式,收集的对象加入至尾端。

6.如果希望对Queue的两端加入,移除等操作,则可以使用java.util.Deque。

7.数组在内存中会是线性连续的空间,根据索引随机存取速度快,排序时,可使用ArrayList。

8.java中许多要判断对象是否重复,都会调用hashCode() 和equals(),两个方法必须同时操作。

9.跟顺序有关的行为,通常要不是对象本身就是comparable,要不就是另行指定comparator对象告知如何排序。

10.接口只有一个方法必须操作时,使用Lambda表达式取代匿名类语法。

11.增强式for循环,可运用在数组上,还可以操作Iterable接口的对象上。增强式for循环是编译程序的蜜糖。

12.使用JDK8想要迭代对象还有新的选择,Iterable上新增了forEach()方法。

13.一般常用properties的setproperty()指定字符串类型的键值。

14.使用getproperty()指定字符串类型的建。

15.想要去的Map中所有键,可以调用Map的keyset()返回set对象。

16.想要取得键与值,可以使用enterSet()方法。

17.Map没有继承Iterable,有个forEach()方法是定义在Map接口上的,可以使用这个结合Lambda表达式,在迭代键值时获得不错的可读性。

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

  • 在课本p233页上,Average4这个代码中:
package TryCatch;
import java.util.Scanner;
public class Average4{
public static void main(String[] args) {
double sum = 0;
int count = 0;
while(true) {
int number = nextInt();
if(number==0) {
break;
}
sum+=number;
count++;
}
System.out.printf("平均 %.2f%n",sum/count);
}
static Scanner console = new Scanner(System.in);
static int nextInt() {
String input = console.next();
while(!input.matches("\\d*")) {
System.out.println("请输入数字");
input = console.next();
}
return Integer.parseInt(input);
}
}
~        

出现

"\\d*"

这个代码,不太明白什么意思,于是上网搜索查询了一下。

  • 解决:

\d正则表达式是非数字的意思,以非数字分割字符串。而\d*表示有多位数字。

  • 课本p240页代码中,将字母转换为大写的代码时
toUpperCase()

那么转换为小写的代码是什么?

  • 解决:
toLowerCase()
  • 课本p241页中提到善用堆栈追踪,前提是程序代码中不可有私吞异常行为。那么什么叫私吞异常行为?如果私吞异常了,会发生什么情况?

  • 解决:
    私吞异常包括在捕捉异常后,什么都不做,不做处理。这样程序代码会对应用程序造成危害,造成出错困难,找不到错误根源。
    image

  • lambda表达式和匿名内部类有什么相同点和不同点?

  • 解决
    首先,Lambda表达式是匿名内部类的一种简化,因此它可以取代匿名内部类的作用。但是Lambda表达式并不能取代所有的匿名内部类。
    image
    image

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

  • 在按照课本上p266输入代码后,出现了如下编译错误。
    image总是提示找不到符号。
    但是对照课本上代码对照了一遍还是没找出问题。

  • 解决方案:
    (未解决)

  • 依旧是按照课本p269页代码打下来的,编译不通过,最后找到了错误。
    如下错误代码:
    image

  • 解决方案:

image

用红色圈圈编注出来了。将

set

代码改为

students

即运行成功:

image

  • 按照课本输入p293页和p294页代码,运行错误

p293:

image

image

image

image

  • 原因分析:

image

image是因为没有书中的 .properties 文档。

  • 课本第p297页代码编译时遇到的问题:

image

image

会显示不安全操作这个注释,在这之前很多次遇到同样的问题,但是不影响编译和运行。

  • 解决方法
    image

代码托管

  • 代码提交过程截图:
    image

  • 代码量截图:
    image

结对及互评

与20155215宣言结对学习,她的博客要素齐全,排版也很整齐,都有按老师的要求写。希望再多一点课本中的问题总结,代码量再继续增加总的来说,还是写的很不错的,值得借鉴。继续加油我们可以一起共同努力,在学习java中遇到不懂的问题可以一起讨论。

评分标准(满分10分)

  1. 从0分加到10分为止

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

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

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

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

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

    • 一周提交次数少于20次的不加分

6 其他加分:

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

点评模板:

  • 基于评分标准,我给本博客打分:(0-10)。得分情况如下:9分

  • 参考示例

点评过的同学博客和代码

上周考试错题总结

  • 2.填空:使用JDB进行调试时查看源代码的命令是(list)。

  • 原因:还是对命令掌握的不够熟练,在前几周的开始中总是命令题会错,所以还是用的不够多,不够熟练,练的熟练了才能记于心中。

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

  • 原因:这个题当时是没懂题目的意思,现在看完答案就懂得了,是取下标第一个字母也就是e。

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

  • 原因:这个题漏做了...

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

  • 原因:这个题是真的不会,现在也不太懂。希望老师能讲解一下。

  • 13.填空:标注(@Override)可以从语法上保证方法的Override.

  • 原因:这个错的很不应该,把题目意思弄错了,不应该丢分。

  • 17.判断:Math中的abs()方法可以Override.(X)

  • 原因:之前一直不清楚这个,现在就能记住了。

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

  • 原因:这个之前没有了解过这种概念类的知识点,以后要多加留心,能丰富自己的知识。

感悟心得

  • 对教材感悟

第八章主要讲解了使用try、catch处理异常。认识了异常继承架构。了解了throw、throws的使用,会运用finally关闭资源,和自动关闭资源。认识了AutoCloseable接口。在第九章中,认识了Collecton与map架构,使用Collection与Map操作对象。对收集的对象进行排序。简单介绍了Lambda表达式和泛型语法。我觉得这两章总体来说比之前的都要难一些,有时候很多看不太懂,就会上网搜,或者请教同学。

  • 对考试感悟

这次考试成绩比上次退步了,有几个题目没看懂,还是对课本的知识内容掌握的不够扎实,熟悉,在书上找内容的时候耽误了很多时间,有的命令还是没有熟记,就得在书上查找。所以在学习新课程的同时,应该及时巩固之前学习的内容,不断加强记忆,才能做到熟记于心。

  • 课本中代码的部分展示与思考

这是书上227页的Average程序运行结果:

image
image

在上图中第二图片显示了若输入的数字不是int型会出现的错误提示。这里不符合Scanner对象的预期。

这个是228页程序代码,try和catch做处理。如果发生错误,执行流程会跳离错误点。然后比较catch括号中声明的类型,是否符合被抛出的错误的对象类型,如果是的话就执行catch区块中的程序代码。执行完catch后,没有其他程序代码了,所以程序就结束了。
image

image

而下图这个代码执行完catch区块后,由于还在while中,所以可继续下一个循环流程。

image

image

下面这个代码是书上233页的例子,使用了Scanner的next()的方法来取得用户输入的下个字符串,如果字符串不是数字格式就会提示用户输入数字。matches()方法中设定了

"\\d*"

这是规则表达式,表示检查字符串中的字符是不是数字,若是则返回true。
image

image

书上224页的范例中,c方法调用b方法,b方法调用a方法,而a方法会因为text参考null,然后调用toUpperCase()。可以调用printStackTrace()在控制台显示堆栈追踪。
image
image

书上242页代码,在使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方。

image
image两次都显示的相同的信息。

使用

fillInStackTrace()

方法,可以看到第二次显示堆栈追踪的起点。
image
image

在书上248页代码如下:
image
运行结果如下:
image
如果程序中先return了,而且也有finally区块,就会先执行区块再将值返回。

image
在p253页哪个对象资源会先被关闭呢?
image
如上图运行结果,在try括号中,越后面撰写的对象资源越早被关闭。

image
p268页代码,由于set的特性就是不重复,若有单词相同,则不会重复加入。运行结果如下:
image

image
image
课本p273页代码,可以清楚的看到堆栈结果是先进后出的,所以先显示Justin。

image
课本p283页代码,使用了java.util.Arrays的static方法asList(),这个方法接受不定长度自变量,可将指定的自变量收集为List。运行结果:
image

image
p286操作Comparable,将余额从小到大排序。
运行结果:image

书上p288页代码,操作comparator。
image运行结果:
image

在java的规范中,与顺序有关的行为,通常要不对象本身是Comparable要不就是另行指定的Comparator对象告知如何排序。

image建立操作对象时,可以使用泛型语法指定建与值的类型。要建立键值对应,可以使用put()方法,第一个自变量是建,第二个是值。
image
在hashMap中建立键值对应后,建是无序的,这可以在上图结果中看到。如果想要建有序,则可以使用TreeMap,下图:
image

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 15/15 1/1 23/26
第二周 208/240 2/2 35/38
第三周 376/584 3/3 32/38
第四周 823/1407 4/4 28/30
第五周 986/2393 4/4 21/26

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

参考资料

posted @ 2017-03-26 18:46  短爪爪爪  阅读(293)  评论(5编辑  收藏  举报