学号20172328《程序设计与数据结构》第九周学习总结

学号20172328《程序设计与数据结构》第九周学习总结

教材学习内容总结(异常和递归)

第11章:异常

  • 1.【异常处理】:
    • 一个异常:是一个定义非正式情况或错误的对象,由程序或者运行时环境抛出,可以根据需要捕获和处理。
    • 错误:错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理。
  • 2.【处理异常的三种方法】:①根本不处理异常②当异常发生时处理异常③在程序的某个位置集中处理异常。
  • 3.【未捕获的异常】:如果程序中不处理异常,则程序将非正常的终止运行,并产生关于描述在何处发生什么异常的信息。第一行异常信息表明抛出的是什么异常,并提供了抛出该异常的原因。其他行的信息是方法调用踪迹信息,指明异常在何处发生。通过调用被抛出异常类的方法,也可以获得调用堆栈踪迹。getMessage方法返回一个字符串,解释异常抛出的原因;printStackTrace方法输出调用堆栈踪迹信息。
  • 4.【try-catch语句】:
    • try-catch语句用来标志可能抛出异常的语句块,catch子句跟在try语句块后,用于定义如何处理一种指定的异常。
   try
   {
      语句块
   }
   catch(类型名  标识符)
   {
        语句块    
   }
  • 执行try语句块时,如果没有异常抛出,将继续执行try-catch结构语句后的语句,这是正常情况执行流程。
  • 如果try语句块执行的任何位置抛出了异常,并且存在catch子句,则控制立即转移到相应的catch子句处理异常,即控制转移到第一个与抛出异常相匹配的catch子句执行,执行完之后,跳出try-catch语句结构继续执行。
  • 5.【finally子句】:有点像switch语句中的default语句,无论怎么样,这个语句一定会执行。如果有finally子句,那一定要排在catch子句后,除非没有catch子句。无论try语句块正常退出或由于抛出异常而退出,都将执行finally子句,因此可以利用finally子句管理资源或保证一定执行某段代码。
  • 6.【异常的传递】:
    • 如果在上级调用方法中仍然没有捕获和处理下级传上来的异常,则控制将返回到上级调用方法的更上一级调用方法,这个过程叫做传递异常。异常将一直传递下去,直到被捕获和处理,或直到异常传递出main方法,这时将终止程序的运行并产生错误信息。
    • 如果在一个异常的发生处没有处理和捕获异常,控制将立即返回产生该异常的方法的上一级调用方法,因此可以将程序设计为在上级调用方法(外层调用)中捕获和处理异常。
  • 7.【异常类参次结构】:
  • 定义各种的类由继承关系关联在一起。
    Throwable是Error类和Exception类的父类。许多异常的类型都是由Exception
    类派生,而在这些类中也有许多子类。
    虽然这些高层的类定义在java.lang包里,但定义各种异常的子类却分散定义在其他几个包中,继承关系可以跨包越界。
  • 【自定义异常】:我们可以从Exception类或它的后代类派生一个新类,定义自己的异常,选择什么类作为父类由新异常所代表的问题和条件决定。
  • 【可检测异常和不可检测异常】:Java中唯一不能检测的异常是RuntimeException类的对象或该类的后代类服务对象。所有其他的异常都是可检测异常。
    ❀可检测异常:必须由方法捕获,或者必须在可能抛出或传递异常方法的throws子句中列出来。
    ♤ 在方法定义的声明头中加throws子句就明确了该方法在异常发生时将抛出异常或者传递异常。main方法之所以需要throws子句,是因为它所抛出的异常类由由Exception类派生,从而使得它的子类是一个可检测异常。
    ❀不可检测异常:无需throws子句。
  • 8.【 I/O(输入/输出)异常】:
  • 标准I/O流有三种:
标准I/O流 说明
System.in 标准输入流
System.out 标准输出流
System.err 标准错误流(输出错误信息)
- 书本11.7的例子教我们创建文件和写数据文件。但是更详细的还是老师在课堂上给我们展示的例子。我复制好上传到码云上了,如果你需要可以去看看。[Here you are](https://gitee.com/CS-IMIS-23/20172328lxy/commit/022ad20776b653a9e7bd9ca234127ad176adbdd8) - [学长提问后添加的知识点](Java异常处理中throw和throws的区别): ♤♤♤throw是语句抛出一个异常。 语法:throw (异常对象); ♧♧♧throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)。语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......} > **throw与throws的比较:** 1、throws出现在方法函数头;而throw出现在函数体。 2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。 3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。 > **好的编程习惯:** 1.在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理; 2.用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace(); 3.如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭; 4.如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。

第12章:递归

  • 1.【递归思想】:递归是一种方法能够调用自己的编程技术,掌握递归编程的关键是能以递归的思想考虑问题。
  • 2.【无穷递归和有穷递归】:只有递归定义部分就变成了无穷递归,所以在任何递归定义中必须要有成为基本情况的非递归定义部分,才能使递归最终结束。
  • 3.【递归编程】:每一次对方法的递归调用,都会创建新的局部变量与参数。每次递归都需要新增内存空间,因此无穷递归常产生运行时错误,报告内存耗尽的错误信息。
  • 4.【直接递归和间接递归】:方法调用自己的递归,称为直接递归;如果一个方法调用其他方法,最终导致再次调用自己,则称为间接递归。
  • 5.【递归应用】:迷宫问题和汉诺塔问题。

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

  • 问题1:如何处理异常中的其中一个方法时根本不处理异常?这,这,这不是自相矛盾嘛
  • 1.(〃'▽'〃)本题解答:书上说会对这三种解决异常的方法进行逐个讨论,结果我也只找到了其他两种的讨论,后来我考虑了一下,当不处理异常时,程序直接中断报错,这样来提示自己的错误♤♤然后回去程序里面改正,这估计就是不处理异常的做法吧。
  • 问题2:当时在阅读课本上的代码例子的时候看到一个方法code.substring(3,7)当时在大脑中百度了一下,结果可能网不好,不反应。
  • 2.(〃'▽'〃)本题解答:翻书本解决的
  • ,书本76页第九条。

String subString(int offset,int endindex)
返回字符串中从索引offset开始,到endIndex-1处的字串。

  • 问题3:刚看完书后对自定义异常和java.lang包中定义的异常不太区分,不知道有什么区别,在做pp11.1时专门查了一下。

  • 3.(〃'▽'〃)本题解答:

  • 在 Java中你可以自定义异常。编写自己的异常类时需要记住下面的几点。

  • 所有异常都必须是 Throwable 的子类。

  • 如果希望写一个检查性异常类,则需要继承 Exception 类。

  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

最后给你一张图,(* ̄︶ ̄)

  • 问题4:字节流和字符流到底是什么?为什么在I/O异常这节提到了?定义在java.io包中的那么多方法都怎么系统的理解?
  • 4.(〃'▽'〃)本题解答:
    • 在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)。
    • InputStream,OutputStream,Reader,Writer
      • InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,
      • Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串.
    • 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

代码实践中的问题和解决

  • 问题1:在我做pp11.2时我的catch语句中不能引用我自定义的异常类和变量,我很奇怪,查了资料catch后面括号中应该是要填异常类和变量,但是还是报错。提示也只是让我删掉try-catch语句,那我就是要写这个啊,让我删了,心塞

  • 1.(〃'▽'〃)本题解答:思考很久后,我还是请教了助教,学长告诉我“你是没有理解程序运行逻辑”。这是为什么?就是因为我没有抛出我的异常类的异常(就是说没有throw语句)?是的!自定义的异常类需要先抛出再去解决,不会影响程序中断。

  • 问题2:在做pp12.9时思路不正确,代码没有报错,但在运行时无法实现。

  • 2.(〃'▽'〃)本题解答:之前在草稿纸上将三角阵的坐标一个一个列出来,然后想从索引和坐标的关系着手去做,当时的问题就是直接无法输出。我反复看了好多遍,发现我的递归方法传入的是两个个int型的数字分别代表横纵坐标值,返回的却是数值,这样的不匹配怎么可能运行成功呢。所以我又开始读题,题目表示每一行的数值需要存在数组里面,如果要使用递归的话最方便的就是让其返回一个数组,然后直接在我的main函数下实现。做的时候又卡壳了,我在行数n>3的地方用了索引,然后就出现了下图的奇怪输出,左右两边的数字居然是0;

    然后我就想,不是递归回去了吗?那我在前面的非递归语句中已经说明了是1的呀。但是好像又没有给最后一个数字定值。然后我就加了两个语句在我的else语句块里面pascal[0]=1; pascal[n-1]=1;这样做完之后运行是可以的。

代码托管

上周考试错题总结

  • 问题1:Polymorphism is achieved by(多态性是通过什么实现的呢?)
    A . overloading(重载)
    B . overriding(重写)
    C . embedding(嵌入)
    D . abstraction(抽象)
    E . encapsulation(封装)
  • 1.(〃'▽'〃)本题解答:本题答案是B。当时选了D。❀重载只是为具有不同参数列表的方法提供了备选方案。❀重写提供了多态性,因为适当的方法是根据当前被引用的对象而调用的。❀嵌入是类中包含的类。❀抽象与多态没有任何关系。封装是使用可见性修饰符(公共的、私有的、受保护的)实现的。所以要选择重写。
  • 问题2:Which statement is completely true?(哪句话是完全正确的?)
    A . Java upcasts automatically, but you must explicitly downcast(java中向上的类型转换是自动的,但是向下的类型转换必须明确说明)
    B . Java downcasts automatically, but you must explicitly upcast(java中向下的类型转换是自动的,但是向上的类型转换必须明确说明)
    C . Java expects the user to explicitly upcast and downcast(java中用户向上或者向下转型时都需要明确说明)
    D . Java will both upcast and downcast automatically(java中用户向上或者向下转型时都是自动的)
    E . The rules for upcasting and downcasting depend upon whether classes are declared public, protected, or private(向上转型和向下转型的规则依赖于是否该类被声明为public、protected、private)
  • 2.(〃'▽'〃)本题解答:j本题答案选择A,我选择了E。ava中向上转型是自动的,它是Java支持的单一继承结构的产物。相比之下,向下转换必须由程序员显式地完成。Java只在一个方向上自动转换。向上转型和向下转型的规则并不依赖于任何方式包括使用的可见性修饰符。(本题我查找了资料Java 转型(向上或向下转型)详解及简单实例
  • 问题3:Can a program exhibit polymorphism if it only implements early binding?(如果一个程序仅仅实现了早期绑定,那么它能显示多态吗?

    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(以上都不对)
  • 3.(〃'▽'〃)本题解答:答案选A,我选了B。虽然继承和接口支持多态,但只有在有后期绑定时才会这样做。但是,重载是多态性的另一种体现形式,多个主体,只要程序使用重载,多态就在使用中。
  • 问题4:The fact that the System.out.println( ) method is able to handle such a wide variety of objects, and print them correctly, is an example of the polymorphic nature of the println( ) method.(System.out.println()方法能够处理如此广泛的对象,并正确地打印它们,这是体现多态特性的一个例子。)
    A.ture
    B.false
  • 4.(〃'▽'〃)本题解答:答案是A。由于println()本质上是高度多态的,所以它能够正确地打印各种预定义的(库)和内置(原始)数据。

讲一个很有趣的现象,不管题目多少,已经连续好多周20分哈哈哈,即使都是20,也有错4、7、8、10个的。

结对及互评

-20172301
-20172304

点评模板:

  • 博客中值得学习的或问题:
    • 20172301:在总结学习内容方面,我觉得郭恺同学更擅长表达章节重点所在。排版一直美观,但是这次的博客整体质量(在知识点对比详解之类)不如前很多次那样那样好,可能是这两章内容对他说不是很难理解吧。
    • 20172304:博客简洁美观,内容有点少,其实段志轩同学是务实型的,可能在编程方面优于总结博客方面吧。
  • 代码中值得学习的或问题:
    • 学习编程过程中我发现很多知识点自己不熟悉,很多问题有思路但不会实践于项目中。
    • 有时候有点苦恼,容易放弃。还是要向队友学习,不惜时间,认真钻研,勇于深究。

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

这两天在刷朋友圈和空间的时候突然看到了一个词:积极废人

指那些很爱给自己立Flag,但是永远做不到的人。这类人心态积极向上、行动上宛如废人一般,他们往往会间歇性享乐后恐慌,时常为自己的懒惰自责。

这个词真的很适合我,我就是属于心有浩瀚,却总是被自己的借口打断的人。

我希望不管是在java这门课程的学习上,还是我的其他事情上都能实现自我控制感。这不是要我自己做到多好,我只想有自己的节奏有自己方向有自己的车辙。就像我现在选择尽量不熬夜,每周给自己一定的放松的时间,该投入的时候不遗余力。

最喜欢给父母打电话,每当我觉得事情繁多,前路暗淡,我爸妈总说:你以为最差的结果就是你一事无成回到我们身边,但是我们可能认为那是最好的结果;你尽力就好,我们只要你健康快乐。

可能每个人要走的路都不一样,每个阶段我们遇见不同的人,学习不同的科目,去到不同的地方,看到不同的风景,珍惜不同的对自己珍贵的东西。所以,我会好好珍惜现在,毕竟18岁不长,于我而言还剩短短几月,只有那么两个季度,还有那些密密麻麻,未曾相会的事情。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 100/100 1/1 15/15
第二周 377/477 1/2 20/35
第三周 280/757 2/4 22/57
第四周 973/1730 1/5 35/92
第五周 1000/2730 1/6 40/132
第六周 729 /3459 1/7 40/172
第七周 660/4119 2/9 30/192
第八周 1417/5536 3/12 40/232
第九周 1139/6675 2/14 60/292

参考资料

posted @ 2018-05-12 17:11  虹澄清晓  阅读(345)  评论(4编辑  收藏  举报
页尾