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(),实际上就是强制缓冲区立即写入,形象地说,就是马上把推车推到收银台去结一次账。

《Head First Java》读书笔记(3) - 异常和IO的更多相关文章

  1. Effective Java 读书笔记之八 异常

    一.只针对异常的情况才使用异常 1.类具有状态相关的方法时,可采用状态测试方法和可识别的返回值两个策略. 二.对可恢复的情况使用受检异常,对编程错误使用运行时异常 1.期望调用者能够适当恢复的情况,应 ...

  2. head first java读书笔记

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

  3. think in java 读书笔记 3 —— 数据报

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

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

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

  5. think in java 读书笔记 1 ——移位

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...

  6. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  7. Java读书笔记1

    Java逍遥游记读书笔记 前言 必须先来一句,这是入门级别,高手勿喷~ 写Android的时候总有一些语句不是很理解,其实大部分是Java的内容,所以想系统的学下Java. 这本书——<Java ...

  8. java读书笔记二

    这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向 ...

  9. Windows内核读书笔记——Windows异常分发处理机制

    本篇读书笔记主要参考自<深入解析Windows操作系统>和<软件调试>这两本书. IDT是处理异常,实现操作系统与CPU的交互的关口. 系统在初始化阶段会去填写这个结构. ID ...

  10. Effective Java读书笔记完结啦

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

随机推荐

  1. nGrinder 简易使用教程

    背景 性能压测工具之前使用的是jmeter,这次说的是nGrinder,先直接搬运两者之间的比较 比较点 JMeter nGrinder 结果 实现语言 Java Java = License Apa ...

  2. CSS float 属性

    Float定义: float 属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动. 浮动元素会生成一个块级框,而不论它本身是何种元素.如 ...

  3. javascript:void(0); 是什么意思

    javascript:void(0); 是什么意思.. ------------------------------------------------- 常常在百度云网页版下载东西的时候网页的左下角 ...

  4. 在Debian9(linux)上使用 的 python 3 IDLE(已经安装了python 2.7 的情况下)

    在Debian9(Stable)中默认安装了python2.7和pytohon3.5两个版本,但是没有IDLE,本人想用pytihon3.5的IDLE,将本次解决问题在此Mark一下, 首先,执行 s ...

  5. InvalidateRect和UpdateWindow

    The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT mess ...

  6. TensorFlow框架(4)之CNN卷积神经网络

    1. 卷积神经网络 1.1 多层前馈神经网络 多层前馈神经网络是指在多层的神经网络中,每层神经元与下一层神经元完全互连,神经元之间不存在同层连接,也不存在跨层连接的情况,如图 11所示. 图 11 对 ...

  7. hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...

  8. Just for Today

    Just for today I will try to live through this day only and not tackle my whole life problem at once ...

  9. Keep in Mind

    Do not undermine your worth by comparing yourself with others.It is because we are different and eac ...

  10. java内存区域分析及java对象的创建

    java虚拟机在执行java程序的过程中会将它管理的内存区域加分为若干个的不同的数据区域. 主要包括以下几个运行时数据区域,这里就只介绍经常会用到的 1:java虚拟机栈:我们常说的堆栈,栈就是指的j ...