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

参考资料

posted @ 2018-05-13 21:16  20172308周亚杰  阅读(283)  评论(3编辑  收藏  举报