Java 再学习 模糊的知识 (五)

(一)三种处理系统错误的机制:异常、断言、日志和调试

1. 派生于 RuntimeException 的异常(程序错误导致的异常)包含下面几种情况:
  • 错误的类型转换。
  • 数组访问越界。
  • 访问空指针。
2. 不是派生于 RuntimeException 的异常(程序本身没有问题,其他错误导致的异常)包括:
  • 试图在文件尾部后面读取数据。
  • 试图打开一个不存在的文件。
  • 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。
3. “如果出现 RuntimeException 异常,那么就一定是你的问题。”
4. Java语言规范将派生于 Error 类或 RuntimeException 类的所有异常称为未检查异常,所有其他的异常称为已检查异常。
5. 下列情况应该抛出或者捕获异常:
  • 调用一个抛出已检查异常的方法,例如,FileImputStream构造器。
  • 程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常。
  • 程序出现错误。
  • Java虚拟机和运行时库出现的内部错误。
6. 一个方法必须声明所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。
7. 如何抛出异常类:

1)找到一个合适的异常类。(没有就自定义一个派生于 Exception 或其子类的类习惯上,定义的类应该包含两个构造器,一个是默认的构造器;另一个是带有详细描述信息的构造器(超类 Throwable 的 toString 方法将会打印出这些详细信息))
2)创建这个类的一个对象。
3)将对象抛出。

8. 在 catch 子句中可以抛出一个异常,这样做的目的是改变异常的类型。
9. 建议独立使用 try/catch 和 try/finally 语句块。这样可以提高代码的清晰度。
//内层的 try 语句块只有一个职责,就是确保关闭输入流。
//外层的 try 语句块也只有一个职责,就是确保报告出现的错误。
//这种设计方式不仅清楚,而且还具有一个功能,就是将会报告 finally 子句中出现的错误。
InputStream in = ...;
try{
	try{
		//可能抛出异常的代码
	}
	finally{
		in.close();
	}
}
catch(IOException e){
	//展示错误信息
}
10. 带资源的 try 语句
//try 块退出时会自动调用res.close();
//try 后面可以指定多个资源
try(Resource res1 = ...,Resource res2 = ...){
	//对资源进行操作
}
11. 使用异常机制的技巧:
  • 异常处理不能代替简单的测试,使用异常的基本规则:只在异常情况下使用异常;
  • 不要过分地细化异常;
  • 利用异常层次结构;
  • 不要压制异常;
  • 早抛出,晚捕获。
12. 断言 assert 关键字的两种形式:

1)assert 条件;
2)assert 条件:表达式;
这两种形式都会对条件进行检测,如果结果为 false,则抛出一个 AssertionError 异常。在第二种形式中,表达式将被传入 AssertionError 的构造器,并转换成一个消息字符串。

13. 什么时候应该选择使用断言?请记住下面几点:
  • 断言失败是致命的、不可恢复的错误。
  • 断言检查只用于开发和测阶段。
    因此,不应该使用断言向程序的其他部分通告发生了可恢复性的错误,或者,不应该作为程序向用户通告问题的手段。断言只应该用于在测试阶段确定程序内部的错误位置。

(二)有关集合的一些小知识

1. 需要一个循环数组队列,可以使用 ArrayDeque 类。需要一个链表队列,可以使用 LinkedList 类。
2. “for each”循环可以与任何实现了 Iterable 接口的对象一起工作。
3. 在传统的集合类库中,例如,C++ 的标准模版库,迭代器是根据数组索引建模的。如果给定这样一个迭代器,就可以查看指定位置上的元素,就像知道数组索引 i 就可以查看数组元素 a[i] 一样。不需要查找元素,就可以将迭代器向前移动一个位置。这与不需要执行查找操作就可以通过 i++ 将数组索引向前移动一样。但是,Java 迭代器并不是这样操作的。查找操作与位置变更是紧密相连的。查找一个元素的唯一方法是调用 next ,而在执行查找操作的同时,迭代器的位置随之向前移动。因此,应该将 Java 迭代器认为是位于两个元素之间。当调用 next 时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。
4. Iterator 接口的 remove 方法将会删除上次调用 next 方法时返回的元素。
5. Java 库中的一些具体集合:

Java Collection Class

6. 在 Java 程序设计语言中所有链表实际上都是双向链接的。

学习整理自《Java 核心技术 卷一 基础知识》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章