学号20162321 2016-2017-2 《程序设计与数据结构》第八周学习总结

学号20162321 2016-2017-2 《程序设计与数据结构》第八周学习总结

教材学习内容总结

关键概念

  • 错误和异常代表不常见的或不正确处理的对象
  • 抛出异常时输出的消息提供了方法调用栈的轨迹
  • 每个catch子句处理try块中可能抛出的一种特定类型的异常
  • 不论是正常退出try块,还是因抛出一个异常而退出,都要执行finally子句
  • 如果没有在异常发生处捕获及处理它,这个异常将被传播给调用的方法
  • 如果将会产生异常,程序员必须仔细考虑如何及在哪里处理异常
  • 从Exception类或它的一个后继类派生一个新类,就可以定义新的异常
  • 方块头中的throws子句必须包含本方法中没有捕获及处理的必检异常
  • 流是字节的顺序序列,它可以用做输入源或是输出的目的地
  • System类中的三个公有引用变量表示标准I/O流
  • Java类库中包含了许多类,可用来定义具有不同属性的I/O流

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

  • 问题1:为什么要使用异常

使用异常机制它能够降低错误处理代码的复杂度,如果不使用异常,那么就必须检查特定的错误,并在程序中的许多地方去处理它,而如果使用异常,那就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误,并且,只需在一个地方处理错误,即所谓的异常处理程序中。这种方式不仅节约代码,而且把“概述在正常执行过程中做什么事”的代码和“出了问题怎么办”的代码相分离。总之,与以前的错误处理方法相比,异常机制使代码的阅读、编写和调试工作更加井井有条。(摘自《Think in java 》)。

  • 问题2:关于异常和错误

异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是JVM(Java虚拟机)通知你的一种方式,通过这种方式,JVM让你知道,你已经犯了个错误,现在有一个机会来修改它。Java中使用异常类来表示异 常, 不同的异常类代表了不同的异常。但是在Java中所有的异常都有一个基类,叫做Exception。
错误:它指的是一个合理的应用程序不能截获的严重的问题,大多数都是反常的情况,错误是JVM的一个故障(虽然它可以是任何系统级的服务)。所以,错误是很难处理的,一般的开发人员是无法处理这些错误的,比如内存溢出。

  • 问题3: 程序10.2的理解问题

[static int] parseInt(String s) :将字符串参数作为有符号的十进制整数进行解析。

  • 深入:
    在书中程序10.2中出现两种异常情况

StringIndexOutBoundsException:此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。对诸如 charAt 的一些方法,当索引等于字符串的大小时,也会抛出该异常。
NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

前者是因为district = Integer.parseInt(code.subString(3,7)中code的3-7四个字符中出现了出现了不能转换成数字类型的字符如TRL2K74A5R-12而后者是因为zone = code.charAt(9)中9大于code的字符串大小,导致异常。

  • 问题4:关于throw和throws的加深
    通过查阅总结如下:
    01.throw 是语句抛出一个异常,并获取这个异常的引用,这个异常会被抛到外部的环境,由外部环境进行处理。

    02.throws 是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)

    03.throws可以单独使用,但throw不能, throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使 用,然后再由处理异常的方法捕获。

    04.throw语句用在方法体内,表示抛出异常,由方法体内的语句处理
    throws语句用在方法声明后面,表示再抛出异常,由调用这个方法的上一级方法中的语句来处理,必须做出处理(捕获或继续声明)

    05.throws主要是声明这个方法会抛出这种类型的异常,使其他地方调用它时知道要捕获这个异常,使得提醒必须做出处理。否则编译是不会通过的。
    throw是具体向外抛异常的动作,所以它是抛出一个异常实例。

    06.throws表示出现异常的一种可能性,并不一定会发生这些异常,在没有异常的情况下也是可以用throws的;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。

这里用一段代码来说明

public class User {
    private int Age;
    public void setAge(int age) throws Exception{
        if (age < 0){
            Exception e = new Exception("年龄不能为负数");
            throw e;
        }
        this.Age = age;
    }
    public static void main (String [] args){
        User user = new User();
        try{
            user.setAge(-20);
        }
         catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法setAge声明可能出现异常,那么此函数就没有责任来处理此异常,而是由调用此函数的地方来处理。

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

  • 问题1:书中的程序10.7出现编译错误
    解决过程:粗心了,少了代码outFile.close()为此,查阅总结如下
  1. 通常情况下,任何流都是需要关闭的,否则将造成 memory leak(内存溢出)。
  2. PrintWriter:向文本输出流打印对象的格式化表示形式。
  3. BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
  4. FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
  • 补充:内存泄漏
    其实说白了就是该内存空间使用完毕之后未回收,但是如果一直未回收的话造成内存泄漏的堆积,这会最终消耗尽系统所有的内存.

代码托管

上周考试错题总结

Let Dog be a subclass of Animal, and suppose Animal has a method called speak() that is overridden in the Dog class.  Consider the following code(假设Dog是Animal的子类,且Animal有一个方法speak(),该方法在Dog类中被重载).
Animal spot = new Dog();
spot.speak();
Which of the following is true? (下面哪项是正确的)
D .The speak method defined in the Dog class will be called. (将会调用Dog类中的speak方法)

解析:当时考虑的有点突兀,在上周的博客中都已经总结过,有点懵了当时

Which of the following methods are included with any object that implements the Iterator interface? (下面哪个方法包含了实现Iterator接口的对象?)
D .all of the above(以上都正确)

解析:迭代器接口指定所有对象必须实现它hasNext和Next。因为Java中所有的类是Object类的子类,所以它还将包括toString方法。

An interface cannot declare any instance variables(接口不能声明任何实例变量).
A .true

解析:接口是一组常量和抽象方法

FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准)定义了两层规范,第一层是()?

解析:FHS定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,第二层则是针对/usr及/var这两个目录的子目录来定义。

结对及互评

本周并没有做太多结对的工作,两人都在按自己的节奏学习。

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

本周《单元测试之道》一书读了有大半了,收获不少,但还不够深入,我觉得一定要坚持多读几遍才有感觉,就像在实验二中说的一般,读书的感觉一定要牢牢抓住。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 1/1 10/10
第二周 300/500 1/2 10/20
第三周 500/1000 2/4 15/35
第四周 300/1300 1/5 15/50
第五周 200/1500 2/6 20/70
第六周 200/1700 1/7 10/80
第七周 400/2100 1/8 10/90
第八周 200/2300 1/9 10/100

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

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

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted @ 2017-04-23 19:36  Wb同学在此  阅读(225)  评论(1编辑  收藏  举报