异常和IO:在学习的过程中通过IO这一章会加深自己对异常的认识,因为在IO中,常常要抛异常啊或者是最后要关闭管道啊。
--------------------------------------------------------------------------------------------------------------------------------------------
异常:
异常体系:
Throwable
|--Error
|--Exception
|--RuntimeException
异常有两种:
编译时被检测异常
该异常在编译时,如果没有处理(没有抛也没有try),编译失败。
该异常被标识,代表这可以被处理。
运行时异常(编译时不检测)
在编译时,不需要处理,编译器不检查。
该异常的发生,建议不处理,让程序停止。需要对代码进行修正。
-----------------------------------------------------------------------------------------------------------------------------------------------
对于异常的体系其实很简单,Error是jvm处理的,Exception才是我们要处理的异常,
他们都是继承了Throwable,具有可抛的能力,也就是说可以被throw和throws关键字所操作。
其实对于异常我们理解几个问题就可以解决一大片了,
1,为什么问题是类?
因为用类来描述比较符合面向对象原理,取到异常对象后,对异常进行处理,异常里面对问题进行了详细的描述,可以更容易安全的编写程序
2,Exception和RuntimeException的区别
Exception是必须要处理的异常,这个是我们可以处理的异常,而且一般建议每个都要处理。
而RuntimeException是不建议处理的,为什么呢?因为出现RuntimeException的时刻一般都是程序已经进行不下去了,所以编译器不检测这类内容,等程序员修改代码
3,那么我们可以用面向对象原理来自定义类生成自己的异常吗?
这个是完全可以的,但是有一个问题就是,子类必须继承Exception或者RuntimeException 才具有可抛性,这应该是jvm对异常的一种识别吧,所以必须加上,而且可以使用父类的构造函数和功能,继承就显得更方便了,有了自定义的名字,自定义的异常类型描述,所以非常合适的应用在自己编写的程序中。
4,那么异常的好处是?
* 将问题进行封装。
* 将正常流程代码和问题处理代码相分离,方便于阅读。
-----------------------------------------------------------------------------------------------------------------------------------------------
IO:
异常的体系很庞大,要说把视频看完就全部记得是肯定不可能的,但是在IO的教程重要的其实是其理论。
-------------------------------------------------------------------
一,流操作的基本规律
1,明确源和母的
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer
2,操作的数据是否为纯文本
是,字符流
否则:字节流
3,当体系明确后,在明确要使用哪个具体的对象
通过设备来进行区分
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
这个基本的规律让人在寻找IO流的时候就定下了一个套路,可以很顺利的找到自己想要找的流和处理的方式
二,体系
流的分类
输入/输出流
例如InputStream,OutputStream
字节/字符流
InputStream,Reader
节点流/处理流
举例:
FileInputStream,FileoutStream(硬盘文件)
ByteArrayInputStream , ByteArrayOutputStream (操纵内存)
PipedInputStream , PipedOutputStream(各自为对象)
教程类总结
InputStream(抽象类),OutputStream(抽象类)(基类)
FileInputStream,FileOutputStream,(对文件进行操作)
BufferedInputStream ,BufferedOutputStream(字节缓冲流,增加byte[]进行缓冲)
Reader(抽象类),Writer(抽象类)(基类)
FileReader,FileWriter,(对文件进行操作)
BufferedReader,BufferedWriter,(字符缓冲流)
InputStreamReader , OutputStreamWriter :转换流
PrintStream ,PrintWriter打印流 (利用PrintWriter打印会更加高效的操作数据流)
ObjectInputStream , ObjectOutputStream对象的序列化流--- 必须实现Serializable(接口)才可以序列化
ByteArrayInputStream , ByteArrayOutputStream 内存操作流
PipedInputStream , PipedOutputStream 管道流(输入输出一一对应)
DataInputStream , DataOutputSteam 基本数据类型操作流(写基本数据类型)
RandomAccessFile 随机读写流(具备读写,而且可以移动指针操作数据)
3,找流在API中的方法
体系中名称书写是很讲究的,Stream为后的是字节流,Reader和writer为后的是字符流,而且名称的前缀也显示了是操作什么数据的流
而且其构造方式可以知道那些流或者对象是和自己有关系的,有助于理解流操作的对象。
看流的方法的时候一般是从基类然后向下继承那样查阅,这样就有助于理解子类间共有的关系和区别,从而理解各个类的作用。