异常处理
1.常见异常
1、算术异常类:ArithmeticException
2、空指针异常类:NullpointerException
3、类型强制转换异常:ClassCastException
4、数组下标越界异常:ArrayIndexOutOfBoundsException
5、文件未找到异常:FileNotFoundException
6、操作数据库异常:SQLException
7、I/O 异常的根类:IOException
2.异常处理
处理异常有两种方式
1.在方法声明的位置上使用throws关键字抛出,谁调用就抛给谁
2.使用try…catch语句对异常进行捕捉。这个异常不会上报,自己把异常事件处理了。异常抛到此处位置为止,不在上抛了。
3.异常的分类
1.error
Error是非程序异常,即程序不能捕获的异常,一般是编译或者系统性的错误,如OutOfMemorry内存溢出异常等
2.exception
Exception是程序异常类,由程序内部产生。Exception又分为运行时异常,非运行时异常类。
文件操作、输入输出流等。
IO流根据流向分为 输入流和输出流
根据类型分为字节流与字符流,字节流用于处理二进制数据,以字节为单位进行读写操作;字符流用于处理文本数据,以字符为单位进行读写操作。
字节流:InputStream、OutputStream、FileInputStream、FileOutputStream等。
字符流:Reader、Writer、FileReader、FileWriter等。
还有缓冲流,他是基于字节流或字符流的装饰器,通过在内存中设置缓冲区来提高读写的效率。缓冲流可以减少对底层流的频繁读写操作,从而提高性能。常用的缓冲流类有:
字节缓冲流:BufferedInputStream、BufferedOutputStream。
字符缓冲流:BufferedReader、BufferedWriter。
2.序列化与反序列化
序列化(Serialization)是将对象转换为字节流的过程,以便将其存储在文件中、在网络上传输或在内存中持久化。反序列化(Deserialization)则是将字节流重新转换为对象的过程,以便恢复原始的对象。
实现对象的序列化和反序列化可以通过以下步骤:
- 让要序列化的类实现
java.io.Serializable
接口。这是一个标记接口,没有需要实现的方法,它只是标识该类可以被序列化。
public class MyClass implements Serializable {
// 类的成员和方法
// ...
}
- 创建一个输出流(如
FileOutputStream
或ByteArrayOutputStream
),将其包装在对象输出流(ObjectOutputStream
)中。对象输出流负责将对象转换为字节流并写入输出流。
MyClass obj = new MyClass();
FileOutputStream fileOut = new FileOutputStream("data.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(obj); // 将对象写入输出流
out.close(); // 关闭输出流
- 创建一个输入流(如
FileInputStream
或ByteArrayInputStream
),将其包装在对象输入流(ObjectInputStream
)中。对象输入流负责从输入流中读取字节流,并将其转换为对象。
FileInputStream fileIn = new FileInputStream("data.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
MyClass obj = (MyClass) in.readObject(); // 从输入流中读取对象
in.close(); // 关闭输入流
被序列化的类和其中的字段必须是可序列化的。如果类中的某个字段不需要被序列化,可以使用 transient
关键字进行标记。
public class MyClass implements Serializable {
private transient int transientField; // 不会被序列化的字段
// ...
}
此外,还可以自定义序列化过程,实现 writeObject()
和 readObject()
方法。这样可以在序列化和反序列化过程中自定义对象的写入和读取逻辑。
private void writeObject(ObjectOutputStream out) throws IOException {
// 自定义序列化逻辑
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// 自定义反序列化逻辑
}
通过实现序列化和反序列化,可以在Java中实现对象的持久化、远程通信和跨平台数据传输等功能。
3.在Java中,当一个对象被序列化后,会生成一个包含对象数据的字节流文件。如果对该序列化文件进行修改,可能导致反序列化失败或产生意外结果。
我了解的是原理是通过添加版本号(serialVersionUID)来实现。serialVersionUID 是一个用于标识序列化类的唯一标识符。当一个对象被反序列化时,Java会比较序列化类中的 serialVersionUID 和反序列化类中的 serialVersionUID 是否匹配。如果不匹配,Java会抛出 InvalidClassException
,从而阻止反序列化。
如果在序列化文件被修改后,原始类的结构发生了变化(例如添加、删除或修改了字段、方法等),会导致序列化类的 serialVersionUID 发生变化,从而与反序列化类的 serialVersionUID 不匹配。这样,Java会抛出异常,阻止反序列化。