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异常体系结构:
- 第九章
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页中提到善用堆栈追踪,前提是程序代码中不可有私吞异常行为。那么什么叫私吞异常行为?如果私吞异常了,会发生什么情况?
-
解决:
私吞异常包括在捕捉异常后,什么都不做,不做处理。这样程序代码会对应用程序造成危害,造成出错困难,找不到错误根源。
-
lambda表达式和匿名内部类有什么相同点和不同点?
-
解决
首先,Lambda表达式是匿名内部类的一种简化,因此它可以取代匿名内部类的作用。但是Lambda表达式并不能取代所有的匿名内部类。
代码调试中的问题和解决过程
-
在按照课本上p266输入代码后,出现了如下编译错误。
总是提示找不到符号。
但是对照课本上代码对照了一遍还是没找出问题。 -
解决方案:
(未解决) -
依旧是按照课本p269页代码打下来的,编译不通过,最后找到了错误。
如下错误代码:
-
解决方案:
用红色圈圈编注出来了。将
set
代码改为
students
即运行成功:
- 按照课本输入p293页和p294页代码,运行错误
p293:
- 原因分析:
是因为没有书中的 .properties 文档。
- 课本第p297页代码编译时遇到的问题:
会显示不安全操作这个注释,在这之前很多次遇到同样的问题,但是不影响编译和运行。
- 解决方法
代码托管
-
代码提交过程截图:
-
代码量截图:
结对及互评
与20155215宣言结对学习,她的博客要素齐全,排版也很整齐,都有按老师的要求写。希望再多一点课本中的问题总结,代码量再继续增加总的来说,还是写的很不错的,值得借鉴。继续加油我们可以一起共同努力,在学习java中遇到不懂的问题可以一起讨论。
评分标准(满分10分)
-
从0分加到10分为止
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过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程序运行结果:
在上图中第二图片显示了若输入的数字不是int型会出现的错误提示。这里不符合Scanner对象的预期。
这个是228页程序代码,try和catch做处理。如果发生错误,执行流程会跳离错误点。然后比较catch括号中声明的类型,是否符合被抛出的错误的对象类型,如果是的话就执行catch区块中的程序代码。执行完catch后,没有其他程序代码了,所以程序就结束了。
而下图这个代码执行完catch区块后,由于还在while中,所以可继续下一个循环流程。
下面这个代码是书上233页的例子,使用了Scanner的next()的方法来取得用户输入的下个字符串,如果字符串不是数字格式就会提示用户输入数字。matches()方法中设定了
"\\d*"
这是规则表达式,表示检查字符串中的字符是不是数字,若是则返回true。
书上224页的范例中,c方法调用b方法,b方法调用a方法,而a方法会因为text参考null,然后调用toUpperCase()。可以调用printStackTrace()在控制台显示堆栈追踪。
书上242页代码,在使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方。
两次都显示的相同的信息。
使用
fillInStackTrace()
方法,可以看到第二次显示堆栈追踪的起点。
在书上248页代码如下:
运行结果如下:
如果程序中先return了,而且也有finally区块,就会先执行区块再将值返回。
在p253页哪个对象资源会先被关闭呢?
如上图运行结果,在try括号中,越后面撰写的对象资源越早被关闭。
p268页代码,由于set的特性就是不重复,若有单词相同,则不会重复加入。运行结果如下:
课本p273页代码,可以清楚的看到堆栈结果是先进后出的,所以先显示Justin。
课本p283页代码,使用了java.util.Arrays的static方法asList(),这个方法接受不定长度自变量,可将指定的自变量收集为List。运行结果:
p286操作Comparable,将余额从小到大排序。
运行结果:
书上p288页代码,操作comparator。
运行结果:
在java的规范中,与顺序有关的行为,通常要不对象本身是Comparable要不就是另行指定的Comparator对象告知如何排序。
建立操作对象时,可以使用泛型语法指定建与值的类型。要建立键值对应,可以使用put()方法,第一个自变量是建,第二个是值。
在hashMap中建立键值对应后,建是无序的,这可以在上图结果中看到。如果想要建有序,则可以使用TreeMap,下图:
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 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就接近了。
-
计划学习时间:26小时
-
实际学习时间:21小时