java中的异常
Throwable类 java中错误的定级父类
其下有两大子类
Error : JRE出现的错误 。程序员无能为力,我们不能通过代码的方式解决这类错误
Exception : 程序级别的错误 。我们可以通过代码捕获该类异常,并可以解决
java中使用try catch来完成对异常的捕获和解决的
try{
可能出现错误的代码片段
}
try语句块:由try关键字和一组大括号{}构成。
在大括号中编写可能出现错误的代码。
try块可以独立存在。
try块后通常会紧跟1-n个catch块,catch块是用来捕获并解决出现的这类异常的。catch块可以有若干个。
catch(SomeException e){
异常的解决代码片段
}
通常情况下try后面都要写catch
java中异常抛出的机制
jvm在运行我们的程序时,若出现了一个异常,jvm会创建一个该类异常的实例并抛出,这时jvm会检查出现异常的代码外是否有try块包围,若有则检查try后面的所有catch块。将创建的异常实例顺序调用catch,将调用兼容该异常实例的catch块进行异常处理。
catch定义捕获类型的顺序应该是子类异常在前,父类异常在后。
为了防止我们程序出现catch中未列举的异常而导致程序非正常结束,我们应在最后一个catch中捕获Exception异常。
jvm创建异常实例并通过catch块将该异常交给我们。对于异常我们有几个常用方法。
getMessage() : 用来获取有关异常事件的信息
printStackTrace() : 输出异常的堆栈内容
throw关键字, 用于主动抛出异常
throows关键字
在声明方法时声明该方法可能抛出的异常。一旦声明了,调用该方法的调用者就需要强制捕获该异常。
通常情况,方法中抛出什么异常就应该在方法声明时声明这种异常的抛出!
有一个例外, RuntimeException及其子类在方法中被抛出时 ,不需要在方法声明时声明该类异常的抛出
RuntimeException的常见子类:
1 NullPointerException :
空指针异常
2 NumberFormatException :
数字格式异常
3 ArrayIndexOutOfBoundsException
数组下标越界
4 ClassCastException
类造型异常
RuntimeException属于 非检查期异常,也就是说在编译过程中,会忽略检查该类异常在方法声明中定义的抛出。
finally关键字
finally块出现在异常捕获机制的最后catch块后。或try块后。
finally块无论程序是否出错都将强制执行。
finally块只能写一次, finally中不应该书写return语句,否则方法的正常返回值都不能得到返回了。
子类继承父类并重写父类方法时,若父类声明了异常抛出throws
子类重写方法时可以:
不处理异常(不设定throws)
仅抛出父类定义的部分异常,抛出父类定义的异常的子类异常
不可以:
throws父类没有的异常
throws父类方法声明的异常的父类异常
throw是抛出异常,当方法中遇到该语句时,方法结束,并抛出异常。所以throw后面不要再有必然会执行的语句,否则编译错误。
File类
用于描述文件系统中的一个文件或目录。
File的一个实例就代表一个目录和
文件。
通过File实例我们可以得知它所表示的文件或目录的名字,大小,修改日期等等信息。但是不能对文件内容进行操作。
编写一个方法。
public void deleteFile(File dir){
}
传入的File是一个目录,要做到成功将该目录删除,前提是该目录内部有多级目录和文件
FileFilter文件过滤器, FileFilter是一个接口,里面必须实现一个抽象方法accept()用来定义过滤文件的规则。
文件过滤器用在File的重载方法 listFiles(FileFilter filter) 上
用于获取当前目录下的部分子项
RandomAccessFile, 可以读写文件内容的类。
java文件模型,硬盘中存储的一切都是字节。byte by byte,使用RandomAccessFile可以打开一个文件并对文件进行读写操作。
打开文件可分为只读和读写形式。打开文件操作完毕后要关掉,释放资源。
java的IO I/O input/output
输入流和输出流
输入流 :用于 读取数据的流 , 输出流 : 用于写出数据的流,流的方向是基于程序定的
流根据处理单位分为 :字节流 和 字符流
字节流: 以字节为单位读写数据
字符流: 以字符为单位读写数据
流分为:
低级流 :节点流
高级流 :处理流,过滤流
低级流: 数据有明确来源和去向
高级流: 高级流不能独立存在,需要处理另一个流。
文件输入、输出流
FileInputStream:文件输入流
FileOutputStream:文件输出流
缓冲字节输入流与缓冲字节输出流
BufferedInputStream
BufferedOutputStream
BIS&BOS是高级流
内部维护着一个缓冲区。可以进行高效的读写操作。
区分高级流的最显著特点是看构造方法,若需要传入其他流,那么这个流就是一个高级流。
高级流不能独立存在,因为没有意义,高级流的作用就是对它处理的流中的数据进行加工方便我们读写的。
净水器就是典型的现实中的高级流
DIS & DOS
DataInputStream
DataOutputStream
可以方便的对基本类型数据进行读写。
字符流
以字符为单位读写数据的流
从类的命名上就很容易区分字节流和字符流
字符输入流以 Reader结尾
字符输出流以 Writer结尾
流其实都是以字节进行读写的, 字符流只是在 字节流的基础上以字符为单位进行读写数据,所以 字符流都是高级流。
字符输入流:
InputStreamReader
字符输出流
OutputStreamWriter
字符流可以使用 重载构造方法,在 创建流的时候指定编码集,这样可以以指定的 编码集进行读写数据。
InputStreamReader(InputStream in,String charset)
OutputStreamWriter(OutputStream out,String charset)
缓冲字符输入输出流
BufferedReader
BufferedWriter
以 行为单位进行读写数据。
FileReader与FileWriter
文件字符输入流和文件字符输出流
用于读写 文本文件的流
可以 方便的读取文本文件,但是也有缺点, 不支持设定字符集
PrintWriter
另一种缓冲字符输出流
构造方法:
PrintWriter(File file):创建向给定文件写字符的字符输出流
PrintWriter(OutputStream out):
创建一个基于 字节输出流的缓冲字符输出流
PrintWriter(Writer writer):
将 字符输出流转换为缓冲字符输出流。
PrintWriter(String fileName):
创建给定路径的 文件的字符输出流。