1、异常处理

我们在调用某个方法时,会被编译器告知需要捕捉异常和处理,意味着你调用的这个方法是有风险的,可能会在运行期间出状况,你必须写出在发生状况时加以处理的代码,未雨绸缪!这就是Java中异常处理机制的意义。
异常处理看似和直接使用if else的方式雷同,实际上if else必须嵌入到正常业务逻辑代码中去,逻辑代码和业务代码混杂,而异常将它们独立开来,主次明确,可读性高。
下面两段代码,可以感受一下。
FileReader fr = new FileReader("path");
if (fr == null) {System.err.println("Open File Error");
} else {BufferedReader br = new BufferedReader(fr);while (br.ready()) {String line = br.readLine();if (line == null) {System.err.println("Read Line Error");} else {System.out.println(line);}}
}
14
1
FileReader fr = new FileReader("path"); 

2
if (fr == null) {

3
    System.err.println("Open File Error");

4
} else {

5
    BufferedReader br = new BufferedReader(fr);

6
    while (br.ready()) {

7
        String line = br.readLine();

8
        if (line == null) {

9
            System.err.println("Read Line Error");

10
        } else {

11
            System.out.println(line);

12
        }

13
    }

14
}

try {FileReader fr = new FileReader("path");BufferedReader br = new BufferedReader(fr);while (br.ready()) {String line = br.readLine();System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}
1
try {

2
    FileReader fr = new FileReader("path");

3
    BufferedReader br = new BufferedReader(fr);

4
    while (br.ready()) {

5
        String line = br.readLine();

6
        System.out.println(line);

7
    }

8
} catch (IOException e) {

9
    e.printStackTrace();

10
}

异常分为运行期异常和编译期异常(也称为checked exception 检测异常),实际上编译器不会管运行期的异常的,如数学异常,空指针异常等,它不会要求我们进行try catch,为什么?
在这里还要提一下throws,也就是异常链的概念,我们说捕捉到一个异常,如果不当场处理的话,可以往上抛,让调用者来进行捕获。
假设有一段代码,可能抛出空指针异常,如果你当前代码不进行异常处理,throws的意思即是说,你必须告诉上面的人,我有可能有这个毛病,但是我没改,你自己看着办吧。
假如某代码要求传参必须是正数,负数则抛出异常,但自身不处理,而是throws。那么对于调用者来说,第一调用者知道了我现在正在使用的这段代码它有一定的范围限制,因为编译器告诉我了我必须要抓异常,否则可能会出错;第二调用者可以未雨绸缪来处理这种可能发生的状况。

2、序列化和IO

2.1 写在前面的延伸

突然想到了字符集的相关概念,这里就再提出来温习一下最基本的。
我们知道,对于计算机而言,它仅认识两个0和1,我们所看到的文字、图片、视频等等“数据”在计算机中都是二进制形式存在的。不同字符对应二进制数的规则,就是字符的编码。字符编码的集合称为字符集。
每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

2.2 序列化

一般来说,串流要两两连接才能做出有意义的事情,其中A表示连接,B则是要被调用方法的。为什么要两个?因为连接的串流A是很低级的,以FileOutputStream为例,它是可以写入字节的,但是我们通常不会直接写字节,而是以对象层次的观点来写入,所以还需要高级的连接串流B。
再形象一点,序列化时发生的事情大概是这样:

对象中如果存储的是基本数据类型,那么序列化时很简单,但是如果对象还有其他对象的引用呢?实际上,对象序列化时,被该对象引用的对象也会被序列化。另外,序列化是全有或者全无的,不会出现只序列化一部分的情况,要么完全成功,要么彻底失败。
我们知道,某个我们希望序列化的对象,我们可以让它实现一个标记接口Serializable,但是如果在这个类中有某个变量我们不希望它随着对象一起序列化,那么就把变量标记为transient(瞬时),这样序列化程序就会跳过它。

而至于反向序列化:
注意,可能存在这样的问题,假如我们想把Dog对象还原带回来,而此时某个transient变量已经从double改成了String,很显然,这会伤害到序列化的兼容性。
使用serialVersionUID进行版本控制:
(1)每当对象被序列化的同时,该对象都会被“盖”上一个类的版本识别ID,即serialVersionUID。如果在对象被序列化之后,类有了不同的ID,则还原操作会失败
(2)如果你认为类有可能会演化,则把版本是别ID放在类中

2.3 IO操作

File类,代表磁盘上的文件,但是并不表示文件上的内容,准确地说,你可以想象成文件的路径,而不是文件本身。
File类是IO输入的基本类,这里简单提一下,不详细展开了,下面说我们所谓的缓冲区:

使用缓冲区比没有使用的效率更高,实际上你确实可以直接使用FileWriter,调用write()来写文件,就像如上你在超市购物,你每拿一样东西就跑去收银台付一次账,如果没有像超市推车一样的缓冲区,你确实可以达到最终目的,但是也累得不行,效率还低。
而我们常说的flush(),实际上就是强制缓冲区立即写入,形象地说,就是马上把推车推到收银台去结一次账。

转载于:https://www.cnblogs.com/deng-cc/p/6839620.html

《Head First Java》读书笔记(3) - 异常和IO相关推荐

  1. Java读书笔记(4)-多线程(二)

    Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...

  2. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

  3. think in java 读书笔记 2 —— 套接字

    目录 think in java 读书笔记 1 --移位 think in java 读书笔记 2 -- 套接字 think in java 读书笔记 3 -- 数据报 概要 1. 套接字基本知识 2 ...

  4. Java读书笔记(8)-单例模式

    Java读书笔记(8)-单例模式 今天在阅读<Effective Java 2>第3条时,获知一种使用枚举enum实现单例模式的新方法,然而书上并没有就此展开深入说明,于是上网查阅了一些资 ...

  5. Effective Java读书笔记(二)

    Effective Java 读书笔记 (二) 创建和销毁对象 遇到多个构造器参数时要考虑使用构建器 创建和销毁对象 何时以及如何创建对象? 何时以及如何避免创建对象? 如何确保它们能够适时地销毁? ...

  6. Effective Java 读书笔记(七):通用程序设计

    Effective Java 读书笔记七通用程序设计 将局部变量的作用域最小化 for-each 循环优于传统的 for 循环 了解和使用类库 如果需要精确的答案请避免使用 float 和 doubl ...

  7. #java读书笔记#面向对象2

    上一篇java读书系列笔记文章:#java读书笔记#面向对象1 14.Math类的使用(重点) (1)数学操作类:该类没有构造函数,方法均为静态的 (2)掌握内容 A:成员变量 **E:比任何其他值都 ...

  8. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  9. Effective Java 读书笔记(一)

    前言: 开个新的坑位,<effective java>的读书笔记,之后有时间会陆陆续续的更新,读这本书真的感触满多,item01和item02就已经在公司的项目代码中看到过了.今天这篇主要 ...

  10. Effective Java读书笔记五:异常

    第57条:只针对异常的情况才使用异常 异常是为了在异常情况下使用而设计的,不要将它们用于普通的控制流,也不要编写迫使它们这么做的API. 下面部分来自:异常 如果finally块中出现了异常没有捕获或 ...

最新文章

  1. LeetCode中等题之区域和检索 - 数组可修改
  2. ML之LoR:利用信用卡数据集(欠采样{Nearmiss/Kmeans/TomekLinks/ENN}、过采样{SMOTE/ADASYN})同时采用LoR算法(PR和ROC评估)进行是否欺诈二分类
  3. 403 forbidden_[SpringSecurity] 自定义403页面
  4. 网页设计师的最佳设计工具名单出炉
  5. Magento教程 23:如何获取销售报表?
  6. 基于HTML5 的人脸识别技术
  7. Atitti 图像处理 特征提取的科技树 attilax总结
  8. windows下用wget下载数据
  9. 产品经理认证(NPDP)知识体系指南(笔记2)
  10. 《算法和数据结构》题海战术篇
  11. excel批量删除密码解除密码保护 可多个密码
  12. 题解 P1340 【兽径管理】
  13. Unity Spine 换装方案
  14. css3 3d 过 锯齿,css3 3d旋转 出现锯齿_html/css_WEB-ITnose
  15. 从校园到职场 - 谈谈艺多不压身
  16. CISP-PTE是什么证书,CISP-PTE证书有什么用?
  17. office2016每次弹激活_win10系统office2016激活后仍弹出激活怎么解决
  18. 有CCC认证是不是代表产品的质量好?
  19. 自动控制原理专业词汇中英文对照(三)
  20. ubuntu 16.04升级python3后software updater打开错误

热门文章

  1. python第三方库排行-scikit-learn: Python强大的第三方库
  2. python教材推荐-7种主流数据分析软件比较及经典教材推荐
  3. python百度网盘-bypy-百度网盘Python客户端 linux
  4. python项目开发实战网盘-python项目开发实战 第2版
  5. 汇编和python-python语言属于汇编语言吗?_后端开发
  6. python开发的软件有哪些-有哪些值得推荐的 Python 开发工具?
  7. python解释器运行代码-Python如何运行程序
  8. python excel绘图-Python excel 画图
  9. python爬虫详细步骤-Python爬虫的步骤和工具
  10. python程序设计报告-《Python程序设计》 实验报告.doc