20172301 2017-2018-2 《程序设计与数据结构》第九周学习总结
20172301 2017-2018-2 《程序设计与数据结构》第九周学习总结
教材学习内容总结
第十一章
- 异常的定义:
一个异常是一个定义非正常情况或错误的对象,由程序或运行时环境抛出,可以根据需要进行相应的捕获和处理。
-
异常和错误:错误是不可恢复的问题并且必须捕获处理。而异常的三种解决方法中有一种是可以不用处理异常的。
-
try-catch语句:
我们上面说过处理异常有三种方法,根本不处理异常、当异常发生时处理异常、在程序的某个位置集中处理异常。- 如果不处理异常,那么程序将会非正常地终止执行,并产生关于描述在何处发生什么异常的信息。
- 那么捕获和处理异常就需要使用try-catch语句。
注意:try语句可以没有catch语句,也可以有多个catch语句。每一个catch语句都处理一种try抛出的异常。
这里还要说一下finally子句,无论try语句块正常退出还是由于抛出异常而退出,都将执行finally子句。 - 如果在一处没有捕获和处理异常,那么将会返回到产生该异常的方法的上一级调用方法。也就是说,我们可以在程序的某个位置集中处理异常,而不需要重复处理。
-
自定义异常:我们可以通过继承Exception类或它的后代类来定义一个新的异常,注意,这个新的异常类不是java标准库中的类。
-
可检测异常和不可检测异常:
- 什么是可检测和不可检测异常?
java中唯一的不可检测异常是RuntimeException类的对象或该类的后代类对象。
- 可检测和不可检测异常的区别?
不可检测异常时不需要使用throws子句的。
可检测异常必须由方法捕获,或者必须在可能抛出或传递异常方法的throws子句列出来。
-
I/O异常:
标准I/O流 | 说明 |
---|---|
System.in | 标准输入流 |
System.out | 标准输出流 |
System.err | 标准错误流 |
- 字符流和字节流
第十二章
- 递归定义:
递归是一种事物自身定义自身的过程。
- 无穷递归:类似于无限循环,死循环,会发生无穷递归,不能结束。所以递归方法必须要有if-else判断语句。通常第一个分支检测基本情况的值。基本情况应该就是你要结束的判断条件。
- 递归的直接引用和间接引用,没什么可说的,间接就是调用的方法里有递归。
- 递归的应用:迷宫和汉诺塔问题
教材学习中的问题和解决过程
一些简单的基础问题都在教材内容总结中体现了。
- 问题1:字节流和字符流的区别和效率。主要是不知道什么时候该使用哪一种。在程序设计中合理运用IO操作应该也是必要的。
- 问题1解决方案:
-
首先,我们要清楚字节流和字符流包含哪些类和子类。
-
-
然后,在什么情况下使用字节流和字符流。我们都知道,字节流按照8位传输,字符流按照16位传输。由于字符流使用Unicode字符集,支持多国文字,因此若流要跨越多种平台传输,应使用字符流。
总结来说,字符(Reader和 Writer):中文,字符是只有在内存中才会形成的,操作字符、字符数组或字符串。
字节(InputStream 和OutputStream):音频文件、图片、歌曲,所有的硬盘上保存文件或进行传输的时候,操作字节和字节数组或二进制对象。 -
我们在使用IO操作的时候应该合理设计所需要使用的应该是字节流还是字符流,并要考虑其效率的问题。
参考资料:字节流与字符流的区别&&用字节流好还是用字符流好?
-
- 问题2:throw和throws区别。难以区别什么时候该用throws,什么时候用throw。
- 问题2解决方案:
区别:throws使用在函数头上,后面跟异常类,多个用逗号隔开;
throw使用在函数中,后面跟异常对象。
详细请看链接中的例子。
参考资料:throws和throw抛出异常的使用规则
代码调试中的问题和解决过程
-
问题1:在编写PP12.1的时候,发生了无穷递归错误。
-
问题1解决方案:为什么会发生这种错误,因为没有基本情况。
递归方法必须要有一条if-else语句。
而我则是两个if语句。修改如图。
-
问题2:在编写PP12.9的时候,我本来的思路是运用的ArrayList类,因为其多态性。但是写递归方法的时候却发生了错误。
-
问题2解决方案:所以我考虑了第二个思路,我明显发现
int[]
要比ArrayList类
方便的时候,所以我重新用int[]
编写了程序。
在编写main方法的时候,我还犯了个低级错误,直接System.out.print
了一个数组,结果输出了内存地址。这里就不在另提了。
代码托管
上周考试错题总结
-
Can a program exhibit polymorphism if it only implements early binding? : B
A . Yes, because one form of polymorphism is overloading
B . No, because without late binding polymorphism cannot be supported
C . Yes, because so long as the programs uses inheritance and/or interfaces it supports polymorphism
D . Yes, because early binding has nothing to do with polymorphism
E . none of the above
理解:方法重载不是一种多态。这是早期绑定。而多态应该是动态绑定。 -
Comparing the amount of memory required by selection sort and insertion sort, what can one say? : D
A . Selection sort requires more additional memory than insertion sort
B . Insertion sort requires more additional memory than selection sort
C . Both methods require about as much additional memory as the data they are sorting
D . Neither method requires additional memory
E . None of the above
理解:两个方法都不需要额外的内存。
结对及互评
点评过的同学博客和代码
其他(感悟、思考等,可选)
这两章篇幅虽然不多,但是所涵盖的内容却并不少。使用异常处理问题还是正常处理都是需要我们在设计程序时需要考虑的,合理的使用递归同样也会精简程序。所以,这就体现了程序设计前期的重要性。可能我们在以前可以不用在意,拿到一个程序就可以直接下手编写。但是,随着学习的深入,问题解决的多样化和复杂化,我们应该择优处理。我们更应该锻炼多角度解决问题的能力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 122/122 | 1/1 | 20/20 | |
第二周 | 487/609 | 1/2 | 18/38 | |
第三周 | 482/1091 | 1/3 | 22/60 | |
第四周 | 1357/2448 | 1/4 | 20/80 | |
第五周 | 628/3106 | 1/5 | 20/100 | |
第六周 | 566/3672 | 2/7 | 20/120 | |
第七周 | 934/4606 | 1/8 | 25/145 | |
第八周 | 2407/7013 | 1/9 | 30/175 | |
第九周 | 1504/8517 | 1/10 | 20/195 |