20182301 2019-2020-1 《数据结构与面向对象程序设计》第6周学习总结

教材学习内容总结

  • 异常处理:
    • 错误和异常代表不常见的或不正确处理的对象
    • 三张方式:
      • 不处理异常
      • 在异常发生的地方处理
      • 在程序的其他地方处理异常
  • 不捕获异常
    • 抛出异常时输出的消息提供了方法调用栈的轨迹
    • getMessage方法返回一个字符串说明原因
    • printStackTrace方法输出调用栈跟踪信息
  • try-catch语句
    • 接在try块后的catch子句定义如何处理一种具体异常,一个try可以对多个touch
    • finally无论如何都要执行
try{
    hanshuti}
    catch(){
    }
    finally
}
  • 异常传播:如果没有在异常发生处捕获并及时处理它,这个异常将被传播给调用的方法,程序员必须找到最合适的层处理异常
  • 异常类的层次
    • Error类和Exception类的共同父类是Throwable类。
    • 必检异常和免检异常
      • 方法头中的throws子句必须包含本方法中没有捕获及处理的必检异常
      • 免检异常:RuntimeExeption或后类对象
  • I/O异常(输入/输出)
    • 流是字节的顺序序列,它可以用作输入源或是输出的目的地。
    • System三个共有的引用变量表示标准I/O流
  • 后绑定
    • 多态引用在不同的时候可以指向不同类型的对象
    • 多态引用在运行时才将方法调用与他的定义绑定在一起
  • 通过继承实现多态
    • 将类的一个对象赋予一个类引用,继承实现is-a关系
    • 引用变量可以指向声明继承于它的任意类的任何对象
    • 对象的类型,而不是引用类型,决定调用的方法是哪个版本
Mammal pet;
Horse secretariat = new Horse();
pet = secretariat;
  • 接口
    • 接口是一组抽象方法,不能被实例化。
    • 实现接口的类在类头使用保留字implements,后跟接口名。
    • 如果实现接口,必须把所有方法写上,否则会报错。
    • 接口层次:继承可适用于接口,所以一个接口可派生于另一个接口。子接口继承父接口中的所有抽象方法和常量。
    • Comparable接口
      • if(obj1.compareTo(obj2)<0)
      • System.out.println("obj1 is less than obj2");
    • Iterator接口
      • Boolean hasNext()判断游标右面是否有元素;
      • Object next()返回游标右边元素,并将游标移动到下一位置;
      • void remove()删除游标左边元素;
  • 通过接口实现多态
    • 接口名可以用来声明对象引用变量
    • 接口引用可以指向实现这个接口的任意类的任何对象
    • 方法的参数可以是多态的,这样使方法具备了对其参数进行控制的灵活性。

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

  • 问题1:为什么正方形不能继承长方形?(理解ISA原则)
  • 问题1解决方案:最初的问题,从而引出经典例子:
public class Stack extends Vector {
public Object push(Object item) {
addElement(item);
return item;
    }
public synchronized Object pop() {
  }
}
这三个条件
    子类的前置条件不能强于父类的前置条件。
    子类的后置条件不能弱于父类的后置条件。
    子类的类不变式不能弱于父类的类不变式。
  • 简单来说,正方形相较于长方形来说,太过于特殊,所以不能继承。如果硬要把它想成长方形,就失去了本来的意义。

  • 问题2:Throwable类的子类用法

  • 问题2解决方案:

  • Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。

  • Exception是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。

    • unchecked exception(非检查异常)
      也称运行时异常(RuntimeException),比如常见的NullPointerException、IndexOutOfBoundsException。对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。
    • checked exception(检查异常,编译异常)
      也称非运行时异常(运行时异常以外的异常就是非运行时异常),java编译器强制程序员必须进行捕获处理,比如常见的IOExeption和SQLException。对于非运行时异常如果不进行捕获或者抛出声明处理,编译都不会通过。
      图:
  • 问题3:字节流与字符流的区别?

  • 问题3解决方案:

    • 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串
    • 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
    • Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间(0x00-0xffff),如果已到达流的末尾,则返回 -1
    • inputStream的read()虽然也返回int,但由于此类是面向字节流的,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。因此对于不能用0-255来表示的值就得用字符流来读取!比如说汉字.

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

  • 问题1:老师给的模板为什么不能运行?图:

  • 问题1解决方案:因为没有创建文件夹,系统找不到文件夹,不能创建文件。
  • 在解决这个问题时,我了解到了两种书写文件夹的方法:一种是/;另一种是\\,第一个表示转义字符。
  • 问题2:书本第九章代码9.7出现问题,为什么?
    图:

  • 问题2解决方案:该方法只返回了return,与count--并无关系,书上笔误;
  • 问题3:实验中再次写入中出现问题,怎么办?图:
  • 问题3解决方案:

  • 将字节输入改为字符串输入
    图:

  • 问题4:java之字符串与byte[]数组如何互转?
  • 问题4解决方案:
  • 字符串变成byte类型数组的转换如下
String a="田江南 你好";
	byte[] by = null;
		by = a.getBytes("utf-8");
  • 字节数组变成字符串转换如下:
String a =new String(by);
System.out.println(a);
  • 问题5:Android真机可以收到响应BufferedReader.ready()返回true,但是readline却一直阻塞,怎么办?
  • 问题5解决方案:readline()只有在遇到换行符的时候才会结束,因为发消息的时候加一个换行符即可。

代码托管第九章

代码托管第十章

书本代码第九章

书本代码第十章

(statistics.sh脚本的运行结果截图)

上周考试错题总结

  • 错题1:

  • 原因:语句if (list[j] < temp) c++;将list中的每个元素与temp进行比较,并仅在元素小于temp时将一个元素添加到c中,因此它计算list中小于temp的元素数量,并将结果存储在c中。
  • 错题2:

  • 原因:重载只是为具有不同参数列表的方法提供了替代方法。覆盖提供了多态性,因为调用适当的方法取决于当前引用的对象。嵌入是类中类的封闭。抽象与多态性无关。封装是使用可见性修饰符(public、private、protected)实现的。
  • 错题3:

  • 原因:决定调用哪个方法的是对象的类型,而不是引用的类型
  • 错题4:

  • 原因:为此,只需使用接口名或基类名来声明变量。然后参数是多态的,在执行期间引用类的正确实例,在执行期间访问正确的语义
  • 错题5:

  • 原因:二叉搜索只在数据排序的情况下有效。二分搜索算法假设每对数据元素之间存在严格的升序或降序关系。没有这个顺序,二分查找就不能正常工作。
  • 错题6:

  • 原因:抛出异常是被当前的代码如果代码包含在一个try语句和适当的catch语句实现,否则是传播的方法调用的方法引起的异常,在一个合适的声明,否则继续传播通过相反的顺序的方法,这些方法被调用。但是,一旦到达主方法,这个过程就会停止。如果没有被捕获,异常将导致程序终止(这将是答案a,异常被忽略)。但是,不会将异常抛出给异常类。
  • 错题7:

  • 原因:B、C和D中的答案都是正确的,runtimeexception是可抛出的对象,不属于Error类,有两种类型的runtimeexception是arithomeexception和NullPointerException。非runtimeexception的异常包括各种已检查的异常,但runtimeexception不是已检查的异常
  • 错题8:

  • 原因:数据流表示特定的源或目标流,用于输入或输出。处理流类似于数据流,其中一些附加的流程被添加到输入或输出中。例如,处理字节流可能会从文件中输入所有项,并删除任何非数字的ASCII字符,以便预期为数字的输入不会引发NumberFormatException。
  • 错题9:

  • 原因:在Java, System中有三个可用的默认流。在系统。。,system . err所有这些都是带有System的对象。作为一个输入流,系统。输出是一个输出流和系统。err是一个错误流(也是一个输出流)。
  • 错题10:

  • 原因:如果在程序的任何地方都没有捕捉到抛出的异常,则程序终止,显示运行堆栈跟踪的内容。运行堆栈跟踪的第一项是抛出的异常及其抛出位置(抛出异常的类的方法的行号)。
  • 错题11:

  • 原因:选中的异常必须被捕获,或者必须在一个抛出子句中列出。未检查的异常不需要抛出子句。这两种异常都遵循异常传播的规则。

点评过的同学博客和代码

  • 本周结对学习情况

- 结对学习内容
    - 学习异常
    - 学习三要素

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

《Think in Java》中写道:“开发一个程序时,最好的方法就是将对象想象为‘服务提供者’,程序通过调用若干对象提供的服务来实现预期目标。”
我必须不断训练自己拥有这个思维。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 69/69 2/2 30/30
第二、三周 529/598 3/5 25/55
第四周 300/1300 2/7 25/80
第五周 2665/3563 2/9 30/110 接口与远程
第六周 1108/4671 1/10 25/135 多态与异常

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:30小时

  • 实际学习时间:25小时

  • 改进情况:
    这周的别的事情较多,所以很急,以后一定好好把本次课程复习一下。

参考资料