博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20162330 2016-2017-2《程序设计与数据结构》第8周学习总结
阅读量:5334 次
发布时间:2019-06-15

本文共 6283 字,大约阅读时间需要 20 分钟。


2016-2017-2 学习总结目录:          


20162330_刘伟康_ 第8周学习总结

主目录



教材学习内容总结

第十章 异常

  • 1.异常处理的三种方式:
    • 不处理
    • 在发生处处理
    • 在其他地方处理
  • 2.错误与异常的区别:
    • 错误一般不可恢复,所以不应该被捕获;
    • 异常一般可恢复,应该被捕获。
  • 3.异常输出(栈跟踪信息);

  • 4.使用try-catch语句抛出异常(一个try可以有多个catch对应);

  • 5.finally语句(退出try块必须执行);

  • 6.异常传播的过程(如果传出main方法将会导致程序中断);

  • 7.异常的类之间的层次关系:(从Exception类或它的某个后代类派生一个新类,就可以定义自己的异常)

    1062725-20170423132310288-455497955.png

  • 8.免检异常(RuntimeException)与必检异常(throws);

  • 9.程序中流的概念(字节的顺序序列);

  • 10.I/O异常(必检异常);(还未掌握)

  • 11.使用I/O流写入数据(关闭输出文件流)。(还需练习)

蓝墨云班课

  • 1.Java当中的异常:
    • 中断了正常指令流,后面程序不再执行;
    • 分类:编译报出异常属于CheckException,运行异常UncheckException不会被编译器报错;
      1062725-20170423134502210-1324075546.png
    • Error会使虚拟机直接退出,虚拟机对Error无能为力;
    • 使用try + <有可能出现异常的代码>如果出现异常catch执行打印异常信息;如果无异常不执行catch中的语句;
    • finally中经常进行一些清理处理;
    • throw的作用(抛出虚拟机判断不了的异常);
    • throws的作用(在调用函数时对异常进行处理)。
  • 2.Java当中的IO:
    • 目标:从数据源中读取数据,写入数据目的地;
    • 流向(来源和目的地多种多样);
    • 分类:输入与输出、字节与字符、节点与处理流;
    • 核心类:
      1062725-20170423141519101-679037713.png
    • 读取文件和写入文件的方法;
    • 各个流的使用方法;(还需练习)
    • 装饰者模式;(还未掌握)
  • 3.内部类和匿名内部类。(还需熟悉)

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

  • 问题1:为什么可以不继承Exception或者其子类而直接调用getMessage方法与printStackTrace方法说明抛出异常的信息?

  • 问题1解决方案:(搜索)(查阅API文档)(询问队友)

  • 这个问题是由于我对catch后面的括号中内容类型不清楚导致的。
  • 首先,我搜索到:所有的异常类都是Exception类的子类,而Exception类派生于Throwable类,而getMessage()printStackTrace()是Exception的方法,所以会被继承。

    1062725-20170423174035663-1640309211.png

  • 但是,在一些程序中并未继承异常类,为什么可以在输出中直接调用这两种方法呢?
  • 我注意到每个在输出中直接调用这两种方法的类中的catch语句后面都有一个括号内的声明,继续搜索发现:catch后面括号应该放入希望捕获的异常,即异常声明,就是要定义一个异常类中的对象,这个对象会自动调用这两种方法。

    1062725-20170423173639632-1613219869.png

  • 问题2:不理解教材中的一句话“虽然这些高层次类定义在java.long中,但是定义具体异常的众多子类却在其他包中”。方法是从一个类中调用的,而Exception属于java.long包,难道所有异常类不在同一个包中定义吗?

  • 问题2解决方案:(查阅API文档)

  • 一些高层次的类,例如Exception,RuntimeException等定义在java.lang包中。

    1062725-20170423182948179-583760044.png
    1062725-20170423182953069-874599065.png
    至于一些具体类,如LineUnavailableException类定义在javax.sound.sampled包中,这是一个java对音频处理的包;又如BadStringOperationException类定义在javax.management包中,这些包非常杂乱,原来这种方法的调用以及继承关系可以跨越包的边界!
    1062725-20170423183001757-704560340.png

  • 问题3:对于书中提到的System.err并没有详细地介绍其用法,只是提到System.err流通常是提供错误信息的地方,所以对于System.err用法不太熟悉。还有为什么出错和调试时使用要System.err?

  • 问题3解决方案:(搜索)

  • 简单来说,就是out有缓存,err无;
    当向控制台输出信息时,开发者有两个选择:System.out和System.err。使用者更倾向于输出的是System.out,而如果是 System.err则输出“error”。
    当输出一个流时,JVM和操作系统共同决定何时输出这个流。也就是说,尽管开发者键入了:
System.out.print("Test   Output:");

JVM和操作系统的组合体并不会立即输出这个流。相反,它将保持等待状态直到将要输出的东西达到一定的量。

假设输入以下指令:

System.out.println("Debugging   Info.");

JVM可能同意输出;然而,操作系统可能决定暂不输出。

由于这个原因,在调试程序时想要发现出错的位置就有可能成为问题。考虑以下的程序:

for(int   i=0;   i<56;   i++)   {     System.out.println(i);     ...   //   containing   an   error  }

错误可能出现在i等于54时,但是可能JVM在i等于49时就结束输出了。50到54仍然存在于缓存中,结果也就丢失了。

使用System.err来报告错误、调试程序就可以避免这种情况出现,它将使每一次操作的结果都输出出来。例如以下程序:

for(int   i=0;   i<56;   i++)   {     System.err.println(i);     ...   //   containing   an   error  }

在每一次i等于54时都将显示错误信息。

所以System.out.println可能会被缓冲,而System.err.println不会;

  • 我在IDEA中新建了一个简单的测试类,发现System.err.println输出不定位置不定,还发现如果程序输出正常,则用err还会输出红色字体。
    1062725-20170423195752522-21885423.png
    在网上还找到一句话:err是运行期异常和错误反馈的输出流的方向。
    当然,对于具体什么时候使用此语句,我还需继续摸索。

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

  • 问题1:在蓝墨云班课第一个异常视频中如果不加try,catch则会出现编译异常。在加上try,catch之后编译成功,但是我运行时什么都没有输出,按理来说catch应该打印异常信息,为什么没有显示?
    1062725-20170423161908319-2093506883.png
    在加上finally输出之后才会在运行时先休眠再输出,这样来看原来不加try,catch的程序应该没有错,但是为什么原程序在编译时会出现抛出未报告的异常错误?
    1062725-20170423161921647-596972890.png
    1062725-20170423161827757-1453238684.png
  • 猜想:

    1.会不会因为这是编译型的异常,并不能在调整后的运行中体现出来。
    2.如果在catch中加上输出语句仍然无输出,说明无异常,所以是不是说catch只能打印出runtime的异常,而无法打印,或者说无法检测到原程序的编译异常。

  • 问题1解决方案:(提问)(查阅API文档)

  • 通过在API中搜索,解决了问题。

    1062725-20170423162319960-1291711245.png
    1062725-20170423162327491-593120807.png
    总结来说就是:当线程在活动期间或之前处于休眠状态时会抛出InterruptedException的异常。而sleep又规定当抛出该异常时当前中断状态被清除,所以在用try,catch编译通过后,运行时应该是把出现的异常信息清除了,用finally输出也可以证明。

  • week8:
    1062725-20170423190454382-1610268028.png
    1062725-20170423190500397-470070942.png
    (statistics.sh脚本的运行结果截图)

上周考试错题总结(绿色选项为正确答案)

第七周测试:

  • 错题1:假设Horse是Animal的子类,且都不是抽象类。下面哪项是无效的声明和初始化?

    A .Horse h = new Horse();
    B .Horse h = new Animal();
    C .Animal a = new Animal();
    D .Animal a = new Horse();
    E .all of the above(以上都正确) are valid(以上都是有效的)

  • 错误原因:不熟悉显示调用一个类的具体操作。
  • 加深理解:因为马是动物的一个子类,选b需要显式类。对于此内容,书中也有对应解释:如果Animal类是Horse类的父类,则Animal引用可以指向Horse类的对象。这个功能可用如下的代码表示:
Animal pet;Horse h = new horse();pet = h; // a valid assignment

这就是所谓的向上转型。将类的一个对象赋给另一个类的引用,看起来好像违背了第2章讨论的强类型概念,但实际并非如此。强类型声称,一个变量只可以赋予与所声明类型一致的值。这正是此处出现的情况,因为继承确定了一个is-a关系,即马是一个(is-a)哺乳动物。所以将Horse对象赋给Animal引用完全合理。

相反的操作,即把Animal对象赋给Horse引用也是可行的,但需要进行显示转换(向下转型)。这样的赋值一般没有什么用途,而且很可能会引起问题。
这个关系对所有的类继承都适用。如果Animal类继承于Creature类,则下面的赋值语句是可行的:

Creature creature = new Horse();

同理,对于Animal也一样。

  • 错题2:假设Dog是Animal的子类,且Animal有一个方法speak(),该方法在Dog类中被重载.
Animal spot = new Dog();spot.speak();

下面哪项是正确的?

A .这段代码会引起编译时错误
B .这段代码会引起运行时错误
C .将会调用Animal类中的speak方法
D .将会调用Dog类中的speak方法
E .不会调用任何speak方法

  • 错误原因:没有弄清楚speak方法会在Animal中被调用还是Dog类中被调用。
  • 解析:狗类中定义的方法将在这种情况下。在运行时,Java虚拟机确定是指向一个对象类型的狗并且结合在犬类中定义的方法。因为speak方法在Dog类中被重载,方法的名字相同但是执行的动作可能不同,此时调用的是子类中的方法。

  • 错题3:下面哪个方法包含了实现Iterator接口的对象?

    A .next
    B .hasNext
    C .toString
    D .all of the above(以上都正确)
    E .a and b(a和b)

  • 错误原因:在书中看到toString方法与接口无关,于是没选。
  • 解析:迭代器接口指定所有对象必须实现它hasNext和next方法。因为所有对象都是Java对象类的一个子类,它还将包括toString方法。所有的类都是Object类的子类,toString是Object的方法会被继承。

  • 错题4:假设Animal是一个指定了单一方法的接口--speak。现在假设Dog类实现了Animal接口。除了speak方法外,Dog类还有一个方法wagTail。现在思考下面的代码:
Animal a = new Dog();a.wagTail();

关于这段代码,下面哪项是正确的?

A .这段代码会引起编译时错误
B .这段代码会引起运行时错误
C .这段代码将会调用Animal接口中的speak方法
D .这段代码将会调用Dog类中的wagTail方法
E .以上都正确

  • 错误原因:之前new实例化对象过程有遗忘。
  • 解析:这段代码会导致编译时错误,因为动物界面没有指定wagTail的方法。当调用wagTail方法时这个编译时错误可以避免通过显式构造一个狗。

  • 错题5:假设Animal是一个接口。那么,通过初始化Animal接口创建一个对象是可能的.

    A .true
    B .false(以上都正确)

  • 错误原因:误将“创建”当成“派生”,没有注意关键字。
  • 解析:接口不能被实例化。

  • 错题6:Linux中获取当前路径的绝对路径的命令是()?

    A .cd
    B .passwd
    C .tree
    D .pwd(以上都正确)

  • 错误原因:之前的命令有遗忘。
  • 加深理解:使用 cd 命令可以切换目录,在 Linux 里面使用 . 表示当前目录,.. 表示上一级目录(以 . 开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,可以使用 ls -a 命令查看隐藏文件), - 表示上一次所在目录,~ 通常表示当前用户的 home 目录。使用 pwd 命令可以获取当前所在路径(绝对路径)。

    passwd 修改用户登录口令,tree给出目录树结构。

结对及互评

  • 张旭升本周状态较好,对于I/O流有比较清晰的逻辑,实验的进度靠前,每周博客发表时间很早。这周我在和他进行类集框架的讨论时,发现他对于之前的内容稍有遗忘,希望下周他在合理安排本周任务的同时,能够花一部分时间回顾之前的内容。

点评过的同学博客和代码

  • 本周结对学习情况
    • 结对学习内容:
      • 类集框架的讨论;
      • catch括号内容的讨论。
  • 上周博客互评情况

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

感悟

  • 本周框架内容较少,展开内容较多,感觉一些概念比较绕,还有I/O流内容的学习不够深入,云班课上的视频也只是介绍了一小部分。所以在自主练习时使用API非常重要。
  • 本周时间安排较为合理,比较全面地学习了本章内容,但是对于书中部分程序仍然缺乏理解。
  • 对于之前的内容,本周也有花费时间回顾,感觉云班课的视频需要反复观看,尽量不要忽略细节。
  • 本周状态比较稳定,下周会继续保持。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 95/95 1/4 12/12 学会了编写简单的脚本和课本上的java程序
第二周 512/607 1/5 14/26 学会了Scanner类编写简单的java程序,了解了数据转换相关知识
第三周 484/1091 1/6 14/40 学会了创建简单的String,Random,Math等类的对象,安装并使用IDEA工具,并且了解了一些java位运算符
第四周 1176/2267 2/8 24/64 学会了条件及循环语句的基本表达,大致了解数组元素及对象数组的概念
第五周 838/3105 1/9 14/78 加深了对面向对象、方法结构和类定义的理解
第六周 427/3532 1/10 12/90 主要了解super调用函数的方法,继承及其目的
第七周 1086/4618 2/12 18/108 了解接口,理解多态,大致学习了工厂模式,UML建模,TDD
第八周 537/5155 1/13 12/120 了解I/O流的作用,学会了异常处理的方法,API

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:,

  • 计划学习时间:20小时

  • 实际学习时间:12小时

  • 有效学习时间:4小时

  • 改进情况:本周仍然先进行视频学习,再对照书本学习。又抽出一部分时间回顾之前的内容,效果一般。仍然需要克服惰性,提起精神多练习。

(有空多看看)

参考资料

转载于:https://www.cnblogs.com/super925/p/6752490.html

你可能感兴趣的文章
五一 DAY 4
查看>>
关于System.__ComObject一些问题
查看>>
java stringbuffer二
查看>>
(转)接口测试用例设计(详细干货)
查看>>
js Math对象方法 (个人学习笔记)
查看>>
helm-chart-2-chart结构和简单模板
查看>>
【译】SSH隧道:本地和远程端口转发
查看>>
win8.1安装Python提示缺失api-ms-win-crt-runtime-l1-1-0.dll问题
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
判断两个字符串是否相等【JAVA】
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>
协议和代理
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法(转)...
查看>>
[转]iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用
查看>>
Spring mvc初学
查看>>
python标准库学习7
查看>>