1 2 3 4

20172310 2017-2018-2 《程序设计与数据结构》第九周学习总结

20172310 2017-2018-2 《程序设计与数据结构》第九周学习总结

教材学习内容总结

第十一章

  • 异常处理:

    • 一个异常是一个定义非正常情况或是错误的对象,可根据需要进行相应的捕获或处理。错误则是不可恢复的问题并且必须捕获处理。
    • 有三种方法处理一个异常
      1.根本不处理异常
    1. 当异常发生时处理异常
    2. 在程序某个位置集中处理异常
  • 未捕获的异常

    • 如果程序不处理异常,则将会立即结束执行,并输出与异常有关的信息
    • 第一行异常输出信息表明抛出的是什么异常,并提供了抛出该异常的原因。其他行的信息是方法调用堆栈踪迹(call stack trace)信息,指明异常在何处发生。实际有多少行踪迹信息取决于产生异常的位置。第一个踪迹行指出发生异常的方法、文件和代码行号,如果还有其他迹行,则指出调用发生异常方法的其他方法。
  • try-catch语句

    • try-catch语句用于标志可能抛出异常的语句块。
    • catch子句跟在try语句块后,用于定义如何处理一种指定的异常。try语句块可以有多个相关联的catch子句,每个catch子句称为一个异常处理器。
  • finally子句

    • 注意,try语句块可以没有catch子句。没有catch子句时,如果需要仍然可以使用finally子句。
  • 异常的传递

    • 如果在一个异常的发生处没有捕获和处理该异常,控制将立即返回到产生该异常的方法的上一级调用方法,因此可以将程序设计为在上级调用方法(外层调用)中捕获和处理异常。如果在上级调用方法中仍没有捕获和处理该异常,则控制将返回到上一级调用方法的更上一级,这个过程称为传递异常。
    • 异常将一在直传递下去,直到算常被和处理为止,或在到常传通出main方法,这时将终止程序的执行并产生异常信息。如果要在外层捕获异常,则必须将可能产生异常的
      方法包含在一个try语句块中,并且该try语句还应该具有 catch子句来处理异常。
  • 异常类层次结构

    • 自定义异常:可由 Exception类或它的后代类派生一个新类来定义一个新的异常
    • 可检测异常与不可检测异常:
      1.可检测异常必须由方法捕获,或者必须在可能抛出或传递异常方法的 throws子中列出来。
      2.在方法定义的声明头中追加一条throws子句,就明确承诺了该方法在异常发生时将抛出或传递异常。不可检测异常则不需要使用throws子句。
      3.Java中唯一的不可检测异常是 RuntimeException类的对象或该类的后代类对象。所有其他的异常都是可检测异常。
  • I/O异常

    • 流是一个有序的字节序列,它可以用做输入源或作为输出目标。
    • 在程序中,将流作为输入流时,可以从输入流读信息;作为输出流时,则可以将信息写入输出流。一个程序可以同时处理多个输入流和输出流。一个数据存储(如文件)可以作为一个程序的输入流或输出流,但一般不能同时既是输入流又是输出流。
    • IO —— 标准输入流和标准输出流

第十二章

  • 递归思想
    • 递归是一种方法能够调用自己的编程技术,掌握递归编程的关键是能以递归的思想考虑问题。
    • 一般来说,递归是以一种事物自身定义自身的过程。
    • 无穷递归
      1.任何一个通归定义中必须有称为基本情况的非道归定义部分,才能使递归最终结束。
    1. 正如对待无限循环问题一样,程序员必须细心地设计算法,避免发生无穷递归。
    • 数学函数和数学公式常以递归的形式表示。
  • 递归编程
    • 每一次对方法的递归调用,都会创建新的局部变量与参数。
    • 递归方法必定有一条if-else语句,其中一个分支检测基本情况的值。如果没有基本情况,则将发生无穷递归。
    • 每次递归都需要新增内存空间,因此无穷递归常产生运行时错误,报告内存耗尽的错误信息。
  • 递归与迭代的比较
    • 递归不是唯一的选择,每种递归算法都可以用循环迭代替换。
    • 有时递归算法更加简练。
  • 直接递归与间接递归
    • 方法调用自己的递归,称为直接递归
    • 如果一个方法调用其他方法,最终导致再次调用自己,这称为间接递归。
  • 递归的应用
    • 迷宫问题
    • 汉诺塔问题

教材学习中的问题和解决过程

  • 问题1:本周老师开始上课时,其实我的课本是还没有预习完的,所以老师讲的字符流和字节流是什么我一脸懵逼o((⊙﹏⊙))o。但当我学完课本的时候我还是没有搞懂,我就只好求助了一下度娘。
  • 问题1解决方案:
    度娘给出的解释是:

字节流是由字节组成的,字符流是由字符组成的. Java里字符由两个字节组成.字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化。在从字节流转化为字符流时,实际上就是byte[]转化为String时,public String(byte bytes[], String charsetName)有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统默认的long
再给大家一篇参考博客
字节(byte)、二进制、字节流、字符流相关概念分析
对照这篇博客,再去学习老师给的博客Java 常用IO流操作详解
这时就可以完全弄懂了。

  • 问题2:

  • 问题2解决方案:ArithemticException?这是一个什么类?然后我去查了一下API文档。

查完之后我想了想,其实,Exception类的子类和衍生类很多,课本上还学习了自定义异常,所以这些我们不可能全部记下,要用的时候查一下API文档就好了。

  • 问题3:课本后的习题有问到“什么是可检测异常”,但是看完答案后我还是不是很理解。
  • 问题3解决方案:

可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则。
非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已解决了这样一个异常。

代码调试中的问题和解决过程

  • 问题1:在我们学习利用IO流写入写出文件时,遇到了这样一个问题

  • 问题1解决方案:最开始我选择在C盘中建一个文档,但一直报错。这个时候我求助了一下同学,他给我更改了一下创建文件所在的位置,改到了D盘,然后才成功。他告诉我说C盘含有比较多的权限,最好选择建在D盘,哈哈,原谅我之前都不知道

  • 问题2:想要能够比较两位数

  • 问题2解决方案:我在编写的时候想到了,我将一串数字作为String输入,并以空格符作为数字间的分隔,这样的话就是(length+1)/ 2,但是学长又提出来一个要求,两位数字也要能进行排序,所以我将代码编写为int[] b = new int[st.countTokens()];,解决了问题。

  • 问题3:pp12.1要求我用递归的方法改写判断字符串是否为回文,开始的时候我一点思路都没有,连递归该出现在什么地方都没有想法,然后我想起

递归不是唯一的选择,每种递归算法都可以用循环迭代替换。

  • 问题3的解决方案:递归应该替换掉的是循环,我的想法就是判断两端的字母是否相同,然后在判断删去两端字母后的字符串的两端的字母是否相同……
    然后我进行了编写。

结果发生了这样的错误。
再看了几遍我写的代码才发现,我的迭代中没有设置基本情况,发生了无穷递归TAT。

  • 问题4
  • 问题4的解决方案:
    我尝试了加一个toString方法,但是A是一个数组会产生错误

    这样不行,我就打算新建一个类,但是类还需要创建新的参数,最后还需在实例化的类中去实例化。
    然后我就想着直接在main中实例化一个GetResult的数组,来得到值。

这样终于得到了正确的值。

代码托管

上周考试错题总结

  • 错题1及原因,理解情况

这道题目会错还是因为自己没有理解好异常传递的概念。虽然知道如果在一个异常的发生处没有捕获和处理该异常,控制将立即返回到产生该异常的方法的上一级调用方法,因此可以将程序设计为在上级调用方法(外层调用)中捕获和处理异常。如果在上级调用方法中仍没有捕获和处理该异常,则控制将返回到上一级调用方法的更上一级,这个过程称为传递异常。但是还是没有掌握到异常传播意味着一个异常被匹配的catch子句在当前try块级别,如果没有匹配,然后在下一个封闭try块级别,等等,直到异常已经被匹配的条款或异常的主程序和被Java虚拟机。

  • 错题2及原因,理解情况

我查了一下这两个类:
PrintWriter类 讲解
PrintStream类
所以PrintWriter是一个更好的输出流类,它是打印流,因为PrintWriter:PrintWriter类是一个Writer类,而PrintStream类是一个流类。主要的区别在于PrintWriter是专门为文件而设计的,因此有错误检查机制,而它不是PrintStream的一部分。

结对及互评

点评:

  • 博客中值得学习的或问题:

这个问题很好,还给出了很好的答案。
- 对于课本中遇见的问题总结的很详细,而且每个问题都是重要的,看的出来费了很多心思。

  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172309
    • 结对学习内容
      • 课本第十一十二章
      • 继续编写四则运算的代码
      • 讨论课后习题
  • 上周博客互评情况

其他(感悟、思考等,可选)

我觉得十一章的内容有些抽象,理解起来有点小难度。
其实这周完成的任务挺多的,在学到十二章的时候,我翻看课后题的答案时,发现已经到了最后一面了,不得不说我们学的真快,不由得有点小自豪。但我知道自己其实基础不是很扎实,有些时候变通能力不够。我还是要多注重注重基础,多复习复习。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 127/127 1/1 25/25
第二周 278/405 1/2 20/45
第三周 442/847 1/3 20/65
第四周 1063/1910 2/5 30/95
第五周 840/2750 1/6 27/122
第六周 631/3381 1/7 20/142
第七周 914/4295 1/8 20/162
第八周 2534/6829 2/10 30/192
第九周 252/7081 3/13 26/218

参考资料

posted @ 2018-05-13 22:22  qx2017  阅读(258)  评论(1编辑  收藏  举报
页尾