[关闭]
@mSolo 2015-04-26T10:27:47.000000Z 字数 1621 阅读 1147

拜读《Java 编程思想》(下)

Java


第 11 章 持有对象

Q: What happens if two objects have the same HashCode?
Iterate through a LinkedList, calling .equals() on the keys of each HashEntry. This is slow!

Thread Safe collection
Collections.unmodifiableCollection Collections.unmodifiableSet Collections.unmodifiableSortedSet
Collections.unmodifiableList Collections.unmodifiableCollection Collections.unmodifiableMap
Collections.unmodifiableSortedMap
The Queues
ConcurrentLinkedDeque ConcurrentLinkedQueue LinkedBlockingQueue
LinkedBlockingDeque LinkedTransferQueue PriorityBlockingQueue
ArrayBlockingQueue
The CopyOnWrites
CopyOnWriteArrayList
CopyOnWriteArraySet

- ConcurrentHashMap and HashTable( should no longer be used)

第 12 章 通过异常处理错误

  1. 概念
    • 把"描述在正常执行过程中做什么事"的代码和"出了问题怎么办"的代码相分离
  2. 基本异常
    • 可以创建一个代表错误信息的对象,并且将它从当前环境中"抛出",这样就把错误信息传播到了"更大"的环境中。这被称为抛出一个异常
    • 异常使得我们可以将每件事都当作一个事务来考虑,而异常可以看护着这些事务的底线
  3. 捕获异常
    • 监控区域,一段可能产生异常的代码,并且后面跟着处理这些异常的代码
    • 终止与恢复: 虽然恢复模型开始显得很吸引人,但不是很实用。其中的主要原因可能是它所导致的耦合: 恢复性的处理程序需要了解异常抛出ude地点,这势必要包含依赖于抛出位置的非通用性代码。这增加了代码编写和维护的困难
  4. 创建自定义异常
    • 记录日志
  5. 异常说明(throws)
  6. 捕获所有异常
    • catch(Exception e) { // ... }
    • 重新抛出异常: 即把异常抛给上一级环境中的处理程序
    • 异常链: 即捕获一个异常后抛出另一个异常,并且希望把原始异常的信息保存下来。现在所有 Throwable 的子类在构造器中都可以接受一个 cause 对象作为参数,这个参数就用来表示原始异常
  7. Java标准异常
    • Throwable 对象: Error + Exception
    • 异常的分类: checked 和 unchecked
    • 特例: RuntimeException,究其原因,其代表的是编程错误
      • 无法预料的错误。比如从你控制范围之外传递进来的 null 引用;
      • 作为程序员,应该在代码中进行检查的错误;
  8. 使用 finally 进行清理
    • 缺憾: 异常丢失
  9. 异常的限制
    • 覆盖后的event()方法表明,派生类方法可以不抛出任何异常,即使它是基类所定义的异常。同样这是因为,假使基类的方法会抛出异常,这样做也不会破会已有的程序
  10. 构造器
    • 这种通用的清理惯用法在构造器不抛出任何异常时也应该运用,其基本规则是: 在创建需要清理的对象之后,立即进入一个try-finally语句块
  11. 异常匹配
    • 按照代码的书写顺序找出"最近"的处理程序
  12. 其它可选方式
  13. 异常使用指南
    • 在恰当的级别处理问题(即在知道如何处理的情况下才捕获异常)
    • 解决问题并且重新调用产生异常的方法
    • 进行少许修补,然后绕过异常发生的地方继续执行
    • 用别的数据进行计算,以代替方法预计会返回的值
    • 把当前运行环境下能做的事情尽量做完,然后把异常重抛到更高层
    • 终止程序
    • 进行简化
    • 让类库和程序更安全
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注