异常
异常的继承体系:
-
java.lang.Throwable(类):异常体系的父类
-
Error(错误)
-
Exception (异常)
-
-
分两大类:
-
- RuntimeException:它及它的子类都称为运行时期异常
-
- 剩下的都是非运行时期异常,也称为编译时期异常(在程序编译过程中报错)
-
-
Error:
java.lang.StackOverflowError:栈溢出异常,循环套娃
Exception:
Java.lang.NullPointerException 空指针异常,访问了空常量的数据(对空常量操作/调用)
java.lang.ArrayIndexOutOfBoundsException数组索引越界异常:访问了数组中不存在的索引处元素(访问的索引>=长度)
java.lang.ClassCastException:类型转换异常
java.lang.InvalidClassException:无效类异常
java.lang.NumberFormatExcpetion:数值格式异常:将非数字字符串转换成Integer对象会报该异常
ConcurrentModificationException并发修改异常
java.lang.ArithmeticException数学运算异常
java.net.BindException: Address already in use: Cannot bind:端口号占用了
- 端口占用:解决方法1.换端口号,2.终止占用该端口的程序
异常对象的方法:
- public String getMessage():获取异常产生的原因
- public String toString():返回异常的类型与原因
- public void printStackTrace():打印异常类型,产生原因与位置
try { //try监控区域
System.out.println(a/b);
}catch (Exception e){ //catch捕获异常
System.out.println("exception");
}finally { //处理善后工作
System.out.println("finally");
}
final,finally和finalize的区别
- final:修饰类类不能被继承;修饰方法方法不能被重写;修饰变量,变量为自定义常量,只能被赋值一次
- finally: 是异常处理语句的一部分,finally括号内的代码无论是否发生异常,都会被执行,除非JVM提前退出
- finalize:是Object中的方法,被protected修饰,需要子类重写;作用是在gc垃圾回收器回收垃圾时,该方法执行
throw 一个异常对象
- 异常对象有两种:编译时期异常和运行时期异常
throws 异常的类名,可以跟多个
抛出异常,可以抛JDK提供好的异常类对象,也可以抛自定义对象
- throw new Exception(); //抛的是编译时期异常(在此处创建了一个异常)
异常的处理:
-
1.编译时期异常:- 必须要处理,要么try,要么throws
-
2.运行时期异常:- 可以不做任何处理,大多都是数据不合理导致的
try和throw的选择:
1.优先选择用try
2.后续程序继续运行就用try否则用throw
3.自定义的异常:继承exception的异常为编译时异常
继承runtime的异常为运行时异常
IO流:
-
流的分类
- 按数据单位不同分为:字节流(8bit),字符流(16bit)
- 按数据流向不同分为:输入流,输出流
-
抽象类 字节流 字符流
-
输入流 InputStream Reader
-
输出流 OutputStream writer
-
FileInputStream将文件中的数据读入到内存
-
FileOutputStream:将内存中的数据以字节的形式写出到文件中
- 第二个参数为true,会将数据追加到文件末尾
-
读取大文件时建议使用缓冲区
-
read(byte[] bys) :将数据读入到字节数组中,并将读到的长度返回
-
write(byte[] bys, int off, int length):从字节数组中读取数据
- byte.length=1024*8不会占多太多内存,效率相对来说最高,做到和内存和效率的平衡点
-
available()获取读的文件所有的字节个数
-
字节缓冲区流:Buffered操作的是两个数组
-
BufferedInputStream():创建一个缓冲区
-
BufferedOutputStream():将缓冲区数据写出
-
flush()方法:用来刷新缓冲区的,刷新后可以再次写出
-
close()方法:用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出
-
字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组
-
写出回车换行 write("\r\n".getBytes());
-
加密可以使用异或
-
bos.write(b ^ 111) -
字符流:可以读文本,不推荐文件;只读取文本或者写出一段文本可以使用
-
FileReader(File file):给定要读的文件
-
FileWriter(File file,boolean append):构建一个文件对象,如果存在则会清空文件数据
-
BufferedReader
- public String readLine():一次读取一行字符,以字符串形式返回,不读取回车换行符
-
BufferedWriter
- public void newLine():写入换行符
-
java.io.BufferedInputStream extends InputStream BufferedInputStream:字节缓冲输入流
-
java.io.BufferedOutputStream extends OutputStreamBufferedOutputStream:字节缓冲输出流
-
字符流 BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
-
字符流 BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
-
java.io.InputStreamReader extends Reader InputStreamReader:使用指定的charset读取字节并将其解码为字符
-
java.io.OutputStreamWriter extends Writer OutputStreamWriter:使用指定的 charset 将要写入流中的字符编码成字节。
-
OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter。
-
OutputStreamWriter(OutputStream out, String charsetName)创建使用指定字符集的 OutputStreamWriter。
-
OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
-
String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/utf-8,gbk/GBK...不指定默认使用UTF-8
-
-
SequenceInputStream:队列流,序列流:字节输入流
- SequenceInputStream(InputStream s1, InputStream s2):其他输入流的逻辑连接,从第一个直到文件结束达到读取,然后读取第二个
- SequenceInputStream(Enumeration<?>):输入流的有序集合
-
RandomAccessFile:随机访问流,可以对文件读和写
- void seek()设置文件指针偏移量,从这个文件的开始,在下一个读或写发生。
- long length():返回此文件的长度
-
对象流:
-
**ObjectOutputStream:可以将对象写入到文件中,文件打开看不懂** -
将内存中的对象存入到文件中,内存条中的数据在代码执行完毕或者断电情况下都会丢失 -
文件是存在于磁盘(硬盘中),断电后不会丢失 -
将内存条中的数据存入到文件中,使得它长久保存下来,这种操作我们称为持久化,也称为序列化(串行化) -
**ObjectInputStream:也可以从文件中读取对象** -
将文件中的对象(内容)读取到内存中 -
将磁盘中文件中的数据读取到内存中,这种操作我们称为反序列化(反串行化)
-
-
对象流的注意事项:
-
1.要要序列化的对象对应的类必须实现Serializable -
2.readObject读取到文件末尾不会返回-1,也不会返回null,直接抛异常,使得我们无法像之前那样写while(()) -
解决方式1: 当需要将多个对象序列化到文件中,我们先将多个文件存入到集合(List)中,然后将集合对象序列化 -
解决方式2: 使用死循环读,直到报异常,处理异常并结束循环 -
实现序列化接口后,在类中建议创建一个自定义常量用来记录序列化的版本(用来记录类是否发生了变化) -
private static final long serialVersionUID = 值; -
序列化的类实现了序列化接口,在序号化和反序列化时,系统会随机生成一个serialVersionUID,并判断该值是否相同,如果相同就正常,如果不相同就报InvalidClassException(无效类异常) -
为了避免在序列化和反序列出现以上异常,我们人为主动的给他定义一个serialVersionUID,能够正常反序列化
-
-
writerObject(); //序列化
readObject(); //反序列化 -
打印流:PrintStream:字节输出对象
-
PrintWriter:字符输出对象

浙公网安备 33010602011771号