20155303 2016-2017-2 《Java程序设计》第五周学习总结
教材学习中的问题和解决过程
- 『问题一』:受检异常与非受检异常
『问题一解决』:
受检异常:这种在编译时被强制检查的异常称为"受检异常"。即在方法的声明中声明的异常。
非受检异常(运行时异常)在方法的声明中没有声明,但在方法的运行过程中发生的各种异常被称为"不被检查的异常"。这种异常是错误,会被自动捕获。
RuntimeException
和它的子类以及Error
和它的子类都是非受检异常。因此,对于一个方法抛出RuntimeException
和它的子类或者Error
和它的子类。调用它无需进行异常处理,编译器能通过。除此之外的其它异常类都需要进行异常处理,即添加try-catch(-finally)
语句块进行捕捉和处理。
-
『问题二』:
throw
与throws
『问题二解决』:throw
出现在函数体中,用来抛出一个异常。程序会在throw
语句后立即终止,它后面的语句执行不到,然后在包含它的所有try
块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch
子句的try
块。而throws
出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。具体用法如下:
throw语法:throw <异常对象>
throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
注意:throws
表示出现异常的一种可能性,并不一定会发生这些异常;throw
则是抛出了异常,执行throw
则一定抛出了某种异常。
-
『问题三』:
Error
与Exception
『问题三解决』:查询API文档可以得知Error
与Exception
之间的关系:
Error
类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。Exception
类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
Exception
类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try...catch
捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
-
『问题四』:
read()
方法探究
如果使用read()
方法时没有重写,则编译失败:
『问题四解决』:InputStream
被定义为一个抽象类,相应的,该类下的read()
方法也是一个抽象方法,这也就意味着必须有一个类继承InputStream
并且实现这个read
方法。查阅Java8 API,我们可以看到,在InputStream
中定义了三个重载的read()
方法:
但是在这三个方法中,只有参数列表为空的read()
方法定义为抽象方法,这也就意味着在直接继承自InputStream
的所有子类中,必须重写这个方法。
-
『问题五』:
compare()
与compareTo()
在使用方法上的不同
『问题五解决』:查询API文档可了解两者的差异:
compareTo(Object o)
方法是java.lang.Comparable接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable接口的,必须重写public int compareTo(T o)方法。
compare(Object o1,Object o2)
方法是java.util.Comparator接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法。
代码调试中的问题和解决过程
-
『问题一』:
catch()
异常的继承关系
在catch括号中列出的异常不得有继承关系,否则会发生编译错误:
『问题一解决』:多重捕捉时要注意异常继承架构。
-
『问题二』:
try-catch-finally
的执行关系
『问题二解决』:以下面的程序为例:
try {
statement;
}
catch(TheException ex) {
handling ex;
}
finally {
finalStatement;
}
在任何情况下,finally块中的代码都会被执行,不管try
块中是否出现了异常或是否捕获异常。考虑以下几种情况:
若
try
块中没有出现异常,finalStatement
被执行,try
语句的下一条语句被执行。若
try
块中有一个语句引起异常,并被catch
捕获,就会跳过try块中的其他语句,执行catch和finally子句。若catch块没有重新抛出异常,就会执行try语句之后的下一个语句。如果重新抛出异常,就将这个异常传递给这个方法的调用者。若
try
块中有一个语句引起异常,但没有被任何catch块捕获,就会跳过try块中的其他语句,执行finally块,并将异常传递给这个方法的调用者。注意:即使在到达finally块之前有一个return语句,finally块还是会执行。
『问题三』:如何理解课本P247提到的“assert不应当作程序执行流程的一部分”?
这里有一个错误示例:
这个程序中,对personName的赋值被转移到assert
语句中,尽管断言有效时它可以很好地运行(即使用-ea运行
时可以有效地运行)但如果断言失效,则它会运行时报空指针错误。因为断言无效时,personName=personObj.getName()
一句永远不会执行。
『问题三解决』:修改后的正确代码如下:
注意:理解断言最重要的一点是必须不依赖它们完成任何程序实际所需的行为。因为正常发布的代码都是断言无效的,即正常发布的代码中断言语句都不不执行的(或不起作用的)。
-
『问题四』:
hashCode()
与equals()
的区别(编程验证)
『问题四解决』:(1)覆盖hashcode后的Student类::
结果分析:我们没有覆盖equals方法只覆盖了hashCode方法,两个对象虽然hashCode一样,但在将stu1和stu2放入set集合时由于equals方法比较的两个对象是false,所以就没有在比较两个对象的hashcode值。
(2)覆盖equals方法和hashCode方法:
结果分析:stu1和stu2通过equals方法比较相等,而且返回的hashCode值一样,所以放入set集合中时只放入了一个对象。
- 『问题五』:非运行时异常(受检异常)的注意事项(编程验证)
『问题五解决』:(1)子类覆盖父类方法是,父类方法抛出异常,子类的覆盖方法可以不抛出异常,或者抛出父类方法的异常:
(2)子类覆盖父类方法,不能比父类抛出更大的异常:
总结:1:子类覆盖父类方法是,父类方法抛出异常:子类的覆盖方法可以不抛出异常,或者抛出父类方法的异常。
2:父类方法抛出了多个异常,子类覆盖方法时,只能抛出父类异常的子集。
3:父类没有抛出异常,则子类不可抛出异常。若子类发生非运行时异常,需要进行try-catch
处理,不能抛出。
4:子类不能比父类抛出更大的异常。
代码托管
代码提交及代码量截图:
上周考试错题总结
- System.out.println( “HELLO”.( toLowerCase() ) ) 会输出“hello”
『考点』:查询API文档可知toLowerCase()的使用方法:将此字符串中的所有字符转换为小写
- 填空:使用JDB进行调试时单步执行命令有step和next,我们优先使用(next)
『考点』:next
:把函数执行完成;step
:跳进函数内部。
- CH06填空:写出编译P165 RPG.java的命令(javac –d . *.java)
『考点』:P165 RPG.java是一个测试函数,需要把工作类及测试类的程序全部编译。"."表示在当前文件夹下编译。
- Math中的abs()方法可以Override.
『考点』:abs()方法的返回值是绝对值,不能进行重写。
- CH07 填空:用enum定义一个Season的类型表示四季(public enum Season{SPRING, SUMMER, AUTUMN,WINTER})。
『考点』:enum中列举的常数一般用大写字母表示。
- CH07 填空:面向对象中,设计经验可以用(设计模式)表达。
结对及互评
基于评分标准,我给本博客打分:9分。具体如下:
- 正确使用Markdown语法:+1
- 模板中的要素基本齐全:+1
- 教材学习中的问题和解决过程:+3
- 代码调试中的问题和解决过程:+2
- 进度条中记录学习时间与改进情况:+1
- 感想,体会不假大空:+1
点评:可以看出来,马超同学对课本上的内容进行了思考,提出了不少很有价值的问题,这点要向马超学习。模板使用也比较标准。希望以后遇到问题多动手敲代码~继续努力!!!
点评过的同学博客
学习感悟及思考
这一周学习状态不佳,由于周六要参加计算机等级考试,所以前几天将大部分的时间用在刷题上,稍微放松了学校课程的学习。但这周的学习任务并不轻松,所以在接下来的这一周,我需要弥补这周缺失的学习时间,夯实基础,不然很可能阻碍之后的学习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 16/16 | 1/1 | 18/18 | 初步认识了Java |
第二周 | 219/235 | 1/2 | 28/46 | 学习了Java的基本语法知识 |
第三周 | 766/1001 | 1/3 | 23/69 | 了解对象与参考的关系,以及封装的概念与实现 |
第四周 | 984/1985 | 1/4 | 18/87 | 学习了继承与多态的关系,以及接口的多态操作 |
第五周 | 866/2851 | 1/5 | 12/99 | 学习了异常处理,学会使用Collection收集对象 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:软件工程软件的估计为什么这么难,
计划学习时间:25小时
实际学习时间:12小时
改进情况:学习时间不足,以后应该多投入一些时间,加强练习。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)