20172308《程序设计与数据结构》第九周学习总结
20172308 2017-2018-2 《Java程序设计》第九周学习总结
教材学习内容总结
1.第十一章 异常
1.什么是异常:非正常情况或错误的对象,由程序或运行时环境抛出,可根据需要进行捕获处理
2.错误:类似异常,但不可恢复且必须捕获处理
3.try-catch:用于捕获可能出现的异常语句块;try可关联多个catch,catch为异常处理器,用于匹配可能的异常
4.finally子句:保证一定执行某段代码(可以不写)
5.为什么要捕获异常:没有捕获的异常会使程序非正常中止,捕获异常可是程序跳过可能异常语句,继续运行程序
6.异常传递:此级没有捕获异常,会返回向上一级的调用方法,直到被捕获。
7.自定义异常:从Exception类或其后代类中派生的,选择一个作为父类,新异常由所代表的问题和条件决定
8.I/O异常:
2.第十二章 递归
1.自我理解:一种不是循环的循环
2.应用:迷宫,汉诺塔问题
教材学习中的问题和解决过程
-
问题1:书上的重点概念“异常抛出时所输出的信息,提供了方法调用堆栈踪迹”,然而我并不知道什么是堆栈踪迹。。。
-
问题1解决过程:竟然百度不到概念。。。综合理解一下,大概是异常抛出时,IDEA提示错误的那几行红字:指明异常发生在何处
【参考资料】:
辛勤的代码工
既然选择了远方 便只顾风雨兼程
-
问题2:无意中看到一个问题:“是否可以在一个catch代码块里捕获多个异常”,答案是可以的,那如果是这样,还写那么多句catch干嘛,都写一个里面不就好了?
-
问题2解决过程:嗯,这是Java本身的升级,在Java7里,catch代码块得到了升级,用以在单个catch块中处理多个异常。如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度
【参考资料】:
JAVA 7新特性-在单个catch代码块中捕获多个异常
风一样的码农
-
问题3:因为在写习题PP12.1的时候,用递归出了一点问题(已经记录在博客里面),结合书上的自测题,了解一下“什么时候应避免使用递归”以及“递归与循环的比较”
-
问题3解决过程:
1.递归与循环是两种不同的解决问题的典型思路。
2.递归算法:
优点:代码简洁、清晰,并且容易验证正确性。
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。
3.循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。
4.当使用迭代法更简单时,避免使用递归,以避免多次调用方法的开销
【参考资料】:
ggxxkkll的专栏
递归这东西是不是尽量避免使用?
百度知道
何时使用递归
代码调试中的问题和解决过程
-
问题1:PP11.1。我总是觉得书上的问题表述不是很清楚:比如,“在程序的main方法中读取输入的字符串,直到输入“DONE”为止。如果输入的字符串多于20个字符,则抛出异常”。总觉得不是很理解意思:是要输入一长串的字符串,读到DONE就停止读入,然后计算字符串是否超过20个吗?还是要多次输入字符串,直到输入DONE为止,然后累计输入的字符个数是否多余20个;
-
问题1解决过程:
综合以上想法,大概是要多次输入,判断每一次输入的字符串是否超过20个。
1.代码调试过程中发现的第一个问题:在用到字符串判断是否相等的时候,只能用方法. equals
才能判断,用“ == 或者 != ”则不行。
2.题目只要求判断每次输入的字符串是否超过20个,并未要求存储字符串,而我画蛇添足地加了上去,反而导致不能输入任意次了(因为数组需要提前申请内存),现已改正。
3.结合PP11.2,要求的是捕获异常,并输出一条适当信息并继续处理后面的字符串,代码如图:
我输出的结果是:当输入的字符串字符数超过20个时,会输出一条信息,包含异常的字符串,并继续输入直到DONE。
这里遇到的问题是写好了上图中的try-catch语句之后,总是会标红说try语句里的异常不存在,一头雾水,反复对照书上的代码,并未发现错误。后来操作了几个地方,但是无关痛痒,又尝试运行了一次,竟然成功了。最后得出的结论是IDEA没有及时去掉标红吧。 -
问题2:PP12.1。按道理来说,这道题应该很简单,我写的代码应该是对的,代码如图:
如图,我输入了“wew”,这是一个回文,但运行出现了问题,提示是递归的方法有问题 -
问题2解决方案:首先要解释一下代码。我的递归方法,用了两个参数n,m。n为0,代表字符串的索引值为0处的字符;m为最后一位的字符索引值。这样在递归方法里只要比较一下n和m处的字符是否相等就OK了,然后将n+1,m-1,继续比较,层层递归,直到不一样的地方输出不是回文,否则的话到n>m的时候直接输出是回文即达到判断要求。
然后这里有一个问题是:递归的方法里需要提前定义字符串,才能继续比较。但是这个字符串是要用户输入的,而如果在递归方法里写用户交互的方法的话,会导致每一次调用递归方法的时候都要再输一次字符串。如图:
但是递归方法与main方法里的字符串还是不能互通,虽然把递归方法写成一个类,然后再继承它应该可以解决,但是我不大想这样做,总觉得很麻烦。
后来,在main方法外面声明了一个str变量,在main和递归方法里都能调用,如图:
这样算是解决了问题。
还有就是那个getstr的方法,并没有用到,我一开始以为还要在递归方法里get一下才能得到那个输入的字符串,现已删掉。
代码托管
上周考试错题总结
-
错题1:
-
错题1解析:没有关联捕获语句的try语句中没有代码,即引用某个未知的类,使用一个参数,或者处理新内存的生成,将抛出NullPointerException
-
错题2:
-
错题2解析:这两个异常都是RuntimeException的子元素,它本身就是异常的子元素,书上有写到,是我看的不够仔细
-
错题3:
-
错题3解析:书上原话:“Java中唯一的不可检测异常是RuntimeException类的对象或该类的后代类对象。”运行时异常不被检查异常。
-
错题4:
-
错题4解析:如果一个异常的发生处没有捕获和处理该异常,控制将立即返回到产生该异常的方法的上一级调用方法,如果仍未捕获将继续向上一级传递,直到异常被捕获。
-
错题5:
-
错题5解析:这题是蒙的,真的不会。照着机翻的理解一下:扫描器类通过拥有自己的catch (IOException…)catch语句,导致一个IOException的扫描器类中的任何代码都被扫描器类捕获,这样可能使用扫描器类的类就不必处理这个被检查的异常。
-
错题6:
-
错题6解析:这个书上真没有,百度到的东西一大堆,并没有过多的涉及到本题选项所说的东西:PrintWriter类是一个Writer类,而PrintStream类是一个流类。主要的区别是PrintWriter是专门为文件而设计的,因此有错误检查机制,而不是PrintStream的一部分。
-
错题7:
-
错题7解析:我明明记得曾经在哪里看到过try语句可以不用catch的,但是现在找不到了。。。当时我还以为这题绝对会对的
结对及互评
-
博客中值得学习的或问题:
- 侯泽洋同学的博客排版工整,界面很美观
- 问题总结做得很全面
- 对于书上的疑惑总会想办法解决它,这种探索的精神值得我去学习
-
代码中值得学习的或问题:
- 对于编程的编写总能找到角度去解决
-
本周结对学习情况
- 20172302
- 结对学习内容
- 第十一章内容:异常
- 第十二章内容:递归
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 309/309 | 1/1 | 20/20 | |
第二周 | 269/578 | 1/2 | 18/38 | |
第三周 | 236/776 | 1/3 | 22/60 | |
第四周 | 507/1283 | 2/5 | 30/90 | |
第五周 | 631/1914 | 1/6 | 30/120 | |
第六周 | 529/2443 | 1/7 | 25/145 | |
第七周 | 515/2958 | 1/8 | 25/170 | |
第八周 | 1128/4086 | 2/10 | 50/220 | |
第八周 | 1241/5327 | 1/11 | 15/235 |