20145328 《Java程序设计》第5周学习总结

20145328 《Java程序设计》第5周学习总结

教材学习内容总结

语法和继承架构

异常处理关键字

  • 第八章内容主要是对Java的异常处理

  • Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally。

  • Throws:

    • throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。
  • Throw:

    • throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。
  • Try:

    • try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。
  • Catch:

    • catch语句的参数类似于方法的声明,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。
    • catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理的例外类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的例外类型与生成的例外对象的类型完全一致或者是它的父类,因此,catch语句的排列顺序应该是从特殊到一般。
    • 也可以用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类,程序设计中要根据具体的情况来选择catch语句的例外处理类型。 
  • Finally:

    • try所限定的代码中,当抛弃一个例外时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛弃或不抛弃例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。

try...catch语法

  • try…catch语法可以捕捉try部分的异常,如果没有try…catch的时候,出现异常的时候程序就会报错,如果加上try…catch,出现异常程序可以正常运行,只是把错误信息存储到Exception里,所以catch是用来提取异常信息的,我们需要在Catch部分加上一句System.out.println(xxx);等类似的代码,将出现异常可以把异常打印出来。在捕捉到异常之后千万不要像下面这样的代码一样什么都不做:
try{
……
}catch(SomeException ex){
}
  • 这样的话我们在捕捉到错误信息之后都不知道发生了什么,很不利于维护,当然,我们也不可以对异常执行一些错误的处理,这样会误导维护者。

  • 是抓还是抛?

    • throws:自己无法处理,用在方法声明
    • throw:方法中抛出Checked Exception,方法声明中必须有throws

Collection与Map

使用Collection集合对象

  • 本节内容和数据结构与算法这门课有很大的联系,学习起来也颇有触类旁通的感觉
  • List: 类似数组,具有位置信息,带索引
    • 核心方法:
      • add(int index, E element):可以将指定的元素插入此列表中的指定位置。
      • remove(int index):移除此向量中指定位置的元素。
      • set(int index, E element):用指定元素替换列表中指定位置的元素。
    • ArrayList:《数据结构》中的线性表
    • LinkedList:《数据结构》中的链表
  • Set: 其中的对象不能有重复的
  • Queue: 队列
    • 核心方法
      • offer:添加一个元素并返回true,如果队列已满,则返回false
      • poll:移除并返问队列头部的元素,如果队列为空,则返回null
      • peek:返回队列头部的元素,如果队列为空,则返回null
    • Deque: 双向队列

键值对应的Map

  • HashMap:建立的键值对应是无序的
  • TreeMap:建立的键值对应是有序的
  • values方法是获取集合中的所有的值,没有键,没有对应关系
  • KeySet是将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。keySet():迭代后只能通过get()取key。

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

主要问题出现在第八章堆栈的追踪过程以及第九章P265的SimpleLinkedList.java,前者是因为在学习的时候是直接敲代码并调试运行,虽然程序的输出结果与书上一致,但一开始还是吓了一跳,因为没看书所以不知道为什么会输出的是类似错误提示一样的结果,在看过书后得知,

堆栈追踪信息中显示了异常类型,最顶层是异常的根源,以下是调用方法的顺序,程序代码行数是对应于当初的程序原始码,如果使用IDE,单击行数就会直接开启原始码并跳至对应行数(如果原始码存在的话)。printStackTrace()还有接受PrintStream、PrintWriter的版本,可以将堆栈追踪信息以指定方式至输出目的地(例如文档)

而后者则在下面的代码调试中的问题细说

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

在学习教材上的代码时发现一个错误,在调试P265的SimpleLinkedList.java时出现如下图所示的错误,

对照着书上代码看了很多遍排除了是自己在敲写代码过程中的拼写错误后,又对照着书上提供地址所下载的范例代码进行对比后发现书上代码以及示例代码都与自己代码一致后,确定是书上代码以及范例代码出现错误。书上代码如下所示

package week5;

public class SimpleLinkedList {
    private class Node {
        Node(Object o) {
            this.o = o;
        }
        Object o;
        Node next;
    }
    
    private Node first;

    public void add(Object elem) {
        Node node = new Node(elem);        
        if(first == null) {
            first = node;
        }
        else {
            append(node);
        }
    }

    private void append(Node node) {
        Node last = first;
        while(last.next != null) {
            last = last.next;
        }
        last.next = node;
    }
    
    public int size() {
        int count = 0;
        Node last = first;
        while(last != null) {
            last = last.next;
            count++;
        }
        return count;
    }
    
    public Object get(int index) {
        checkSize(index);
        return findElemOf(index);        
    }

    private void checkSize(int index) throws IndexOutOfBoundsException {
        int size = size();
        if(index >= size) {
            throw new IndexOutOfBoundsException(
                    String.format("Index: %d, Size: %d", index, size));
        }
    }

    private Object findElemOf(int index) {
        int count = 0;
        Node last = first;
        while(count < index) {
            last = last.next;
            count++;
        }
        return last.elem;
    }
}

对照书上注释可知,最后一段代码的作用是访问所有Node并计数以取得对应索引对象,根据上面IDEA所提示的错误位置找到第一段代码中private class Node中,由书上注释可知,该段代码的作用是将收集的对象用Node封装,那么由此便可得知,在最后一段代码中return的值就应该是last.o而不是last.elem

而在调试书上P269中的Students.java时出现如下图所示错误,

对比示例代码发现最后一段代码System.out.println()括号中的值应该为students而不是set,而之所以是students而不是set的原因也很简单,在前面的代码中都没有set这个关键字,怎么可能输出set

学习感悟

本周学习下来的感受最大的一点就是不能单纯地对着书敲范例代码,不然虽然敲出了正确的代码,但也只是知其然不知其所以然,并不能明白为什么会是这样的结果,只是单纯地敲代码的程序员和咸鱼又有什么区别?但是又不能完全只对着书傻看,只有两者结合才能让学习更加高效和巩固。

代码托管情况

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 40篇 500小时
第一周 30/30 3/7 28/28
第二周 120/150 1/8 23/41
第三周 400/550 1/9 23/64
第四周 550/1100 1/10 24/88
第五周 800/1350 2/12 18/106

参考资料

posted @ 2016-04-03 23:49  20145328胡东晖  阅读(181)  评论(1编辑  收藏  举报