20162301 2016-2017-2 《程序设计与数据结构》第8周学习总结
蓝墨云班课学习内容
30、31讲 Java当中的异常:异常的定义(中断了正常指令流的事件)、异常的分类(必检异常和免检异常)、try...catch...finally结构的使用方法(处理可能出现异常的代码)、throw与throws的使用方法(throw:抛出异常,并终止代码的运行,throws:声明函数有可能有异常,在调用该函数的地方对异常进行处理)。
32、33、34讲 Java当中的IO:I/O操作的目标(从数据源当中读取数据,以及将数据写入到数据目的地当中)、I/O的流向(数据的流向以Java程序为参照物)、I/O的分类(输入流/输出流、字节流/字符流、节点流/处理流)、I/O当中的核心类、大文件的读写方法、字符流的使用方法、处理流的使用实例、“装饰者”模式、节点流与处理流的关系(被装饰者与装饰者)。
35讲 内部类和匿名内部类:内部类的定义、内部类的使用方法、匿名内部类的使用方法。
教材学习内容总结
第10章 异常
异常处理:①异常又程序或运行时环境抛出,并能被捕获,需要时可进行适当的处理。
不捕获异常:①程序中出现异常不捕获异常,程序会崩溃。②抛出异常时输出的消息提供方法调用栈的轨迹。③调用栈的跟踪:第一行给出原因,栈的第一行给出产生异常的代码(一般为产生异常的原因)。
try-catch语句:①try-catch语句用来标识可能抛出异常的一个语句块②catch子句定义如何处理一种具体的异常,每个catch子句称为一个异常处理器③API文档中带有throws的必须使用try...catch。④如果在try块内发生了异常,则执行对应的catch子句中的代码;如果有finally子句,则不论如何退出try块,都执行其中的语句
异常传播:如果没有在异常发生处捕获及处理它,这个异常将被传播给调用的方法。
异常类的层次:①Error及其子类写程序不用处理,最多留个日志。②Java异常处理是要处理Exception类及其子类(Checked Exception),RuntimeException及其子类也不用处理(Unchecked Exception)是免疫异常。
I/O异常:①流是字节的顺序序列,它可以用做输入源或是输出的目的地。②三个标准的I.O流(System.in/System.out/System.err),这三个引用都声明为public和static,允许通过System类来直接访问它们。
教材学习中的问题和解决过程
- 问题1:学习蓝墨云班课中视频的第31讲时,老师提到了throw和throws的用法,但了解的不具体。
-
解决方案:根据网上资料的查询以及书本内容的学习,大概对throw与throws两者有了初步的了解。
throw是语句抛出一个异常。
语法:throw (异常对象);
如:throw e。
而throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:[(修饰符)(返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
如:public void doA(int a) throws Exception1,Exception3{......}。①throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
②throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。throw是具体向外抛异常的动作,所以它是抛出一个异常实例。
③throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。 - 问题2:节点流与处理流的关系
解决方案:节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。就像视频中老师所说的那样,节点流可看作是被装饰者,处理流被看作是装饰者。问题3:PP10.4中getMessage方法用了System.out.println(problem.getMessage)打印出来了,而方法printStackTrace只用了problem.printStackTrace直接打印出来了。
解决方案:
e.getMessage();
只会获得异常的名称。e.printStackTrace();
会打印出详细的异常信息,异常名称,便于调试。所以e.printStackTrace();直接就会打印出调用栈跟踪信息。
代码调试中的问题和解决过程
- 问题1:git commit 的时候出现了熟悉的错误,根据之前老师给出的解决方法,并没有解决这次的问题。
解决方案:我当时觉得可能是生成的test.dat文件不能跟着commit,所以将该文件移出用户目录,然后再commit就完全成功了。但是具体原因还没有弄清楚,询问中(待更新)。
- 问题2:在做PP10.1的时候计算平均值,得到的结果永远都只有整数部分。
解决方案:一开始,我只是将
int Average
改为double Average
,但是结果只是保留整数部分再加上.0的小数部分.后来将最后计算过程改为average = ((double)sum) / TIMES;
即可。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
-
错题1:The commitment to execute certain code to carry out a method invocation is referred to as _________________(通过提交来执行确定的代码从)而完成方法的调用,被称为____).
A.execution(执行)
B.binding(绑定)
C.polymorphism(多态)
D.inheritance(继承)
E.none of the above(以上都不正确) 正确答案为:B。原因:Binding refers to the commitment to execute certain code to carry out a method invocation.(绑定是指执行某些代码执行一种方法的承诺。)
-
错题2:Which of the following methods are included with any object that implements the Iterator interface? (下面哪个方法包含了实现Iterator接口的对象?)
A.next
B.hasNext
C.toString
D.all of the above(以上都正确)
E.a and b(a和b) 正确答案为:D。原因:书上内容没有仔细看清。书中P259中写道:Iterator接口中的两个基本方法是hasNext和next。但在下一段也写了还有一个方法remove。在关于方法的问题的时候,以后还是要多用JDK,不能凭借自己的印象。
-
错题3:
Consider the following line of code. (思考下行代码)
Comparable s = new String();
Which of the following statements is true about this line? (关于这行代码,下面哪句陈述是正确)
A.It will result in a compile-time error(这行代码会引起编译时错误).
B.It will result in a run-time error(这行代码会引起运行时错误).
C.It will create a String object pointed to by a Comparable reference. (这行代码会创建一个Comparable引用指向的String对象)
D.Although it is perfectly valid Java, it should be avoided due to confusion(虽然这是有效的Java代码,但应该避免使用,以免引起混淆).
E.none of the above are true(以上都正确) 正确答案:C。原因:This is a valid Java statement and will result in no errors, since the String class implements the Comparable interface. (这是一个有效的java语句,结果没有错误,因为字符串类实现Comparable接口。)
-
错题4:
Suppose Animal is an interface that specifies a single method – speak. Now suppose the Dog class implements the Animal interface. In addition to the speak method, the Dog class also has a method called wagTail. Now consider the following code(假设Animal是一个指定了单一方法的接口--speak。现在假设Dog类实现了Animal接口。除了speak方法外,Dog类还有一个方法wagTail。现在思考下面的代码:).
Animal a = new Dog();
a.wagTail();
Which of the following is true about this code?(关于这段代码,下面哪项是正确的)
A.It will result in a compile-time error(这段代码会引起编译时错误).
B.It will result in a run-time error.(这段代码会引起运行时错误)
C.It will call the speak method defined in the Animal interface. (这段代码将会调用Animal接口中的speak方法)
D.It will call the wagTail method defined in the Dog class(这段代码将会调用Dog类中的wagTail方法).
E.none of the above are true. (以上都正确) -
正确答案:A。这道题与另外一道题做一个对比吧。
Let Dog be a subclass of Animal, and suppose Animal has a method called speak() that is overridden in the Dog class. Consider the following code(假设Dog是Animal的子类,且Animal有一个方法speak(),该方法在Dog类中被重载).
Animal spot = new Dog();
spot.speak();
Which of the following is true? (下面哪项是正确的)
A.This code will result in a compile-time error. (这段代码会引起编译时错误)
B.This code will result in a run-time error. (这段代码会引起运行时错误)
C.The speak method defined in the Animal class will be called. (将会调用Animal类中的speak方法)
D.The speak method defined in the Dog class will be called. (将会调用Dog类中的speak方法)
E.The speak method will not be called at all. (不会调用任何speak方法) - 正确答案为:D。
原因:先看第一题,它把Dog类型的对象转型为了Animal,所以用这个对象是无法调用Dog中的方法的。想调用的话需要对这个对象进行一个向下转型[((Dog)a).wagTail();] ,这样才能调用Dog中的wagTail这个方法。所以第一题错误的原因是因为Animal中根本没有这个方法。然后对比着看,第二道题的Animal和Dog中都有这个方法在Dog中重写了这个方法,虽然把对象转型为Animal,但是这个对象还是Dog类创建的,所以调用的就是Dog中的speak。也就是说只要是父类中的方法被子类重写过,然后运用多态调用的就是子类的方法,如果是子类特有的方法就需要做向下转型。用严谨一点的话来讲:指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。
-
错题5:
Consider a reference declared in the following manner(思考下面方式声明的一个引用).
Animal a;
This reference may only point to an object that created by instantiating the Animal class(这个引用只能指向一个通过初始化Animal类创建的一个对象).
A.true
B.false - 正确答案为:B。这道题想要考查的是对于多态的理解。我在网上搜寻关于多态的内容时,发现了一个很好的例子: 比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:酒 a = 剑南春;酒 b = 五粮液;酒 c = 酒鬼酒。这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。
-
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
- 20162308
- 结对学习内容
- 解决学习过程中的问题。
- 上周博客互评情况
其他(感悟、思考等,可选)
这周的学习一如既往的套路,虽然周六出去素拓了一整天,但依旧能按时完成作业,也表现了学习方法正确的重要性。在这周博客互评的部分,感觉到了同学们在学习java上都正在不断进步。马上这学期书本内容的学习就要接近尾声了,将要迎来考验动手能力的编写程序真是又恐慌又期待。
生活,就是一种永恒沉重的努力,努力使自己在自我之中,努力不至迷失方向,努力在原位中坚定存在。
——米兰·昆德拉
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 57/57 | 1/1 | 24/24 | 绪论 |
第二周 | 338/395 | 1/2 | 18/42 | 数据和表达式 |
第三周 | 497/892 | 1/3 | 18/60 | 使用类和对象 |
第四周 | 839/1731 | 1/4 | 30/90 | 条件与循环 |
第五周 | 1018/2749 | 1/5 | 10/100 | 编写类 |
第六周 | 216/ 2965 | 1/6 | 15/115 | 继承 |
第七周 | 507 /3472 | 2/8 | 10/125 | 多态 |
第八周 | 235 /3707 | 1/9 | 10/135 | 异常 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:10小时
实际学习时间:10小时
改进情况:多动手,多理解,多学习。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)